当前位置: 首页 > article >正文

5年java开发经验总结面试题-内含完整答案

1、讲讲IO里面的常见类字节流、字符流、接口、实现类、方法阻塞。文件字节输入输出流 FileInputStream/FileOutputStream文件字符流 FileReader/FileWriter包装流PrintStream/PrintWriter/Scanner字符串输入输出流StringReader/StringWriter转换流InputStreamReader/OutputStreamReader缓存流BufferedReader/BufferedWriter BufferedInputStream/BufferedOutputStreamFlushable接口、Appendable接口、Readable接口同步阻塞IO在此种方式下用户进程在发起一个IO操作以后必须等待IO操作的完成只有当真正完成了IO操作以后用户进程才能运行。异步阻塞NIO此种方式下是指应用发起一个IO操作以后不等待内核IO操作的完成等内核完成IO操作以后会通知应用程序这其实就是同步和异步最关键的区别同步必须等待或者主动的去询问IO是否完成2、讲讲NIO。3、递归读取文件夹下的文件代码怎么实现不好描述设计一个方法传入文件路径判断是否为空不为空new File(testFileDir).listFiles();然后再判断空最后遍历是文本文件还是文件目录4、常用的线程池模式以及不同线程池的使用场景newCachedThreadPool 执行很多短期异步的小程序或者负载较轻的服务器newFixedThreadPool 执行长期的任务性能好很多newSingleThreadExecutor 一个任务一个任务执行的场景NewScheduledThreadPool 周期性执行任务的场景线程池任务执行流程当线程池小于corePoolSize时新提交任务将创建一个新线程执行任务即使此时线程池中存在空闲线程。当线程池达到corePoolSize时新提交任务将被放入workQueue中等待线程池中任务调度执行当workQueue已满且maximumPoolSizecorePoolSize时新提交任务会创建新线程执行任务当提交任务数超过maximumPoolSize时新提交任务由RejectedExecutionHandler处理当线程池中超过corePoolSize线程空闲时间达到keepAliveTime时关闭空闲线程当设置allowCoreThreadTimeOut(true)时线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc5、newFixedThreadPool此种线程池如果线程数达到最大值后会怎么办底层原理。设置固定尺寸的线程池、可变尺寸连接池创建线程池方法固定大小的线程池ExecutorService pool Executors.newFixedThreadPool(5)单任务线程池ExecutorService pool Executors.newSingleThreadExecutor()可变尺寸的线程池ExecutorService pool Executors.newCachedThreadPool()延迟连接池ExecutorService pool Executors.newScheduledThreadPool(2)如果当前线程数小于指定的最大数量则创建新的线程执行任务否则加入到缓冲队列workQueue最终是把需要执行的线程放到一个工作线程workers HashSet里面。这里的work与Thread是分离的这样做的好处是如果我们的业务代码需要对于线程池中的线程赋予优先级、线程名称、线程执行策略等其他控制时可以实现自己的ThreadFactory进行扩展无需继承或改写ThreadPoolExecutor6、了解可重入锁的含义以及ReentrantLock 和synchronized的区别从名字上理解ReenTrantLock的字面意思就是再进入的锁其实synchronized关键字所使用的锁也是可重入的两者关于这个的区别不大。两者都是同一个线程没进入一次锁的计数器都自增1所以要等到锁的计数器下降为0时才能释放锁。除了synchronized的功能多了三个高级功能。等待可中断公平锁绑定多个Condition。等待可中断在持有锁的线程长时间不释放锁的时候等待的线程可以选择放弃等待tryLock(long timeout, TimeUnit unit)公平锁按照申请锁的顺序来一次获得锁称为公平锁synchronized的是非公平锁ReentrantLock可以通过构造函数实现公平锁。new RenentrantLock(boolean fair)绑定多个Condition通过多次newCondition可以获得多个Condition对象可以简单的实现比较负责的线程同步的功能通过await(),signal();7、atomicinteger和volatile等线程安全操作的关键字的理解和使用volatile关键字volatile是一个特殊的修饰符只有成员变量才能使用它与Synchronized及ReentrantLock等提供的互斥相比Synchronized保证了Synchronized同步块中变量的可见性而volatile则是保证了所修饰变量的可见性。可见性指的是在一个线程中修改变量的值以后在其他线程中能够看到这个值在Java并发程序缺少同步类的情况下多线程对成员变量的操作对其它线程是透明的不可见。因为volatile只是保证了同一个变量在多线程中的可见性所以它更多是用于修饰作为开关状态的变量。原子操作AtomicVolatile变量可以确保先行关系保证下一个读取操作会在前一个写操作之后发生(即写操作会发生在后续的读操作之前)但它并不能保证原子性。例如用volatile修饰count变量那么count 操作就不是原子性的。8、进程和线程的区别进程是系统资源分配的最小单位线程是程序执行的最小单位一般启动一个进程就会分配一个空间地址建立数据表来维护代码段、堆栈段和数据段进程程序比较健壮一个进程死掉不会影响到其它独立的进程而线程死掉就会影响到整个进程线程是在同一进程下共享全局变量和静态变量进程是以IPC进行的9、同步和异步阻塞和非阻塞同步与异步同步与异步是针对应用程序与内核的交互而言的。同步过程中进程触发IO操作并等待或者轮询的去查看IO操作是否完成。异步过程中进程触发IO操作以后直接返回做自己的事情IO交给内核来处理完成后内核通知进程IO完成。阻塞与非阻塞应用进程请求I/O操作时如果数据未准备好如果请求立即返回就是非阻塞不立即返回就是阻塞。简单说就是做一件事如果不能立即获得返回需要等待就是阻塞否则就可以理解为非阻塞三、设计模式1、简述一下你了解的设计模式。单例模式用于不会频繁创建对象的场景只能创建一个对象节约内存加快对象访问速度工厂模式普通来说就是根据用户需求创建对象对象方法是继承父类过来的适配器模式就是多写一个实现类来继承通过一个适配器类帮需要添加监听器的对象实现了监听器里所有方法;这个对象只需要实现它需要的方法。模板模式相当于模版并没有实现需要具体的使用才能实现(按照一定规律才产生)把几个对象相同的动作抽取到一个接口里在接口定义动作执行顺序;对象执行动作时实现该接口的方法最后创建环境测试对象的执行顺序调用动作方法;代理模式代理一般是指为其他对象提供代理以控制对这个对象的访问某些情形下不适合直接引用目标对象或者不适合在其他对象中引用则可以使用代理模式以增强对主业务逻辑。装饰者模式动态地给一个对象添加一些额外的职责。就增加功能来说Decorator模式相比生成子类更为灵活。享元模式是结构型设计模式的一种是池技术的重要实现方式它可以减少应用程序创建的对象降低程序内存的占用提高程序的性能用于大量出现相似的对象缓冲池观察者模式就是发布订阅模式发布者发布信息订阅者获取信息订阅了就能收到信息没订阅就收不到信息2、写出单利模式懒汉和饿汉四、JVM1、描述一下JVM加载class文件的原理机制装载:查找和导入class文件;检查:载入的class文件数据的正确性;准备:为类的静态变量分配存储空间;解析:将符号引用转换成直接引用(这一步是可选的)初始化:初始化静态变量静态代码块,在程序调用类的静态成员的时候开始执行所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动2、Java 中会存在内存泄漏吗请简单描述。内存泄露就是指一个不再被程序使用的对象或变量一直在内存中占据着java中内存泄露的发生场景通俗地说就是程序员可能创建了一个对象以后一直不再使用这个对象这个对象却一直被引用即这个对象无用但是却无法被垃圾回收器回收的这就是java中的内存泄露如果一个外部类的实例对象的方法返回了一个内部类的实例对象这个内部类对象被长期引用了即使那个外部类实例对象不再被使用但由于内部类持久外部类的实例对象这个外部类对象将不会被垃圾回收这也会造成内存泄露。3、GC是什么为什么要有GCGC是垃圾收集的意思用于防止内存泄露有效的利用内存。垃圾回收器通常是作为一个单独的低优先级的线程运行不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收 4、JVM的内存模型重要、GC算法、新生代、老年代、永久代等需要详细了解新生代。新建的对象都是用新生代分配内存Eden空间不足的时候会把存活的对象转移到Survivor中新生代大小可以由-Xmn来控制也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例旧生代。用于存放新生代中经过多次垃圾回收仍然存活的对象持久代Permanent Space实现方法区主要存放所有已加载的类信息方法信息常量池等等。可通过-XX:PermSize和-XX:MaxPermSize来指定持久带初始化值和最大值。Permanent Space并不等同于方法区只不过是Hotspot JVM用Permanent Space来实现方法区而已有些虚拟机没有Permanent Space而用其他机制来实现方法区。标记-整理Mark-Compact此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段第一阶段从根节点开始标记所有被引用对象第二阶段遍历整个堆把清除未标记对象并且把存活对象“压缩”到堆的其中一块按顺序排放。此算法避免了“标记-清除”的碎片问题同时也避免了“复制”算法的空间问题。5、GC的工作原理GC通过每个对象有一个引用计数属性新增一个引用时计数加1引用释放时计数减1计数为0时可以回收GC是后台的守护进程对于Java程序员来说分配对象使用new关键字释放对象时只要将对象所有引用赋值为null让程序不能够再访问到这个对象我们称该对象为不可达的.GC将负责回收所有不可达对象的内存空间。对于GC来说当程序员创建对象时GC就开始监控这个对象的地址、大小以及使用情况。通常GC采用有向图的方式记录和管理堆heap中的所有对象。通过这种方式确定哪些对象是可达的哪些对象是不可达的.当GC确定一些对象为不可达时GC就有责任回收这些内存空间。但是为了保证GC能够在不同平台实现的问题Java规范对GC的很多行为都没有进行严格的规定。例如对于采用什么类型的回收算法、什么时候进行回收等重要问题都没有明确的规定。因此不同的JVM的实现者往往有不同的实现算法。这也给Java程序员的开发带来行多不确定性。五、数据库1、事务的ACID是指什么原子性(Atomicity): 操作过程不可分割,要么都成功要么都失败一致性(Consistency):事物操作之后操作前后数据不变;比如转账减少的跟增加的值不变隔离性(Isolation): 多个事物之间的操作是分隔的互不干扰如果有多个事务去操作同一个数据的时候就会事务并发问题(抢购 秒杀 等)持久性(Durability): 成功的完成一个事物处理后最终commit把数据将永久保存在数据库;2、悲观锁和乐观锁的区别悲观锁 就是很悲观每次去拿数据的时候都认为别人会修改每次获取数据前都要被加锁乐观锁 就是很乐观每次去拿数据的时候都认为别人不会修改不会加锁但是每次更新时都要判断是否被修改过可以使用版本号判断3、Left join、right join、inner join区别left join(左联接) 返回包括左表中的所有字段记录、只返回右表中和左表交集的记录不匹配的部分显示nullright join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录不匹配的部分显示nullinner join(等值连接) 只返回两个表中联结字段相等的行4、SQL优化DDL优化变多次索引维护为一次索引维护:插入数据禁用索引插入后再开启变多次唯一校验为一次唯一校验:关闭唯一校验批量插入数据插入后开启变多次事务提交为一次事务提交:把多条插入语句合并为一条在SQL中避免where或order by后经常出现的字段上建索引出现、is null、in、not in、避免在 where 子句中使用 or 来连接条件、like前置匹配都会变成全表扫描索引失效5、redis缓存数据库需要了解什么是内存数据库支持的数据类型把经常使用的数据存放在内存中全局共享减少和数据库之间的交互频率提升数据访问速度主要用于应用程序全局共享缓存常见的内存数据库有Redis、memcached、FastDB支持的常用数据类型可以是键值对数据结构的value支持各种数据类型6、单个索引、联合索引、主键索引单个索引就是在一个列上面创建索引联合索引索引可以覆盖多个数据列如像INDEX(columnA, columnB)索引这就是联合索引。主键索引设定主键而创建的索引把某个列设为主键的时候数据库就会給改列创建索引(主键非空且唯一)7、索引的数据结构B-树、B树、R-树、散列B-树结构支持插入、控制操作以及通过管理一系列树根状结构的彼此联通的节点中来做选择。B-树结构中有两种节点类型索引节点和叶子节点。叶子节点是存储数据的而索引节点是用来告诉用户存储在叶子节点中的数据的顺序并帮助用户找到数据。B树是B-树结构的增强版尽管B树支持B-树的所有特性他们之间最显著的不同点在于B树中底层数据是按照提及的索引列进行排序的。B树还通过在叶子节点之间附加引用来优化扫描的性能。散列表数据结构是一个简单的概念他将一种算法应用到给定值中以在底层数据存储系统中返回一个唯一的指针或位置。散列表的优点是始终以线性时间复杂度找到需要读取的行的位置而不想B-树那样需要跨越多层节点来确定位置。R-树数据结构支持基于数据类型对集合数据进行管理。目前只有MyIsam使用R-树支持空间索引。使用空间索引也有很多限制比如只支持唯一的NOT NULL列等。空间索引并不常用。8、数据库的锁行锁、表锁、悲观锁、乐观锁表锁偏向yISAM存储引擎开销小加锁快无死锁锁定粒度大发生锁冲突的概率最高并发度最低偏向InnoDB存储引擎开销大加锁慢会出现死锁锁定粒度小发生锁冲突的概率最低并发度最高。InnoDB与MyISAM的最大不同有两点一是支持事务二是彩了行级锁悲观锁进行业务操作前先加锁即一锁二查三更新。乐观锁先进行业务操作不到万不得已不去拿锁。六、框架1、web Service 常用注解 客户端如何生成还是手写WebServiceserviceName“PojoService”, portName“PojoPort”, name“PojoPortType”, targetNamespace“http//:Pojo”serviceName 对应portName 对应 下的name 对应targetNamespace 对应 targetNamespace“http//:Pojo”定义schemaLocation的显示WebMethodoperationName“queryPojo”,excludetrueoperationName 接口的方法名、exclude 用于阻止将某一继承方法公开为web服务默认为falseWebResultname“returnWord” 接口的返回值WebParamname“cityName”接口的参数2、mybatis处理大数据分表分为水平分表(hash分表、时间、区间分表)、垂直分表(不常用字段单独表)比如区间分表有跨表查询情况使用关键字 union union all3、AOP IOC优点缺点AOP缺点:性能略低,仅适用于方法调用,必须在Spring容器AOP优点:从Ioc容器中直接获得一个对象然后直接使用无需事先创建让逻辑业务分解解耦代码改变了OOP(Object Oriented Programming)面向对象编程的不足IOC缺点:生成一个对象的步骤变复杂了忽略缺少IDE重构的支持如果修改了类名还需到XML文件中手动修改这似乎是所有XML方式的缺憾所在IOC优点:实现组件之间的解耦提高程序的灵活性和可维护性4、spring事务传播属性和隔离级别NEVER 绝对不能有事物,不然报错,有事物的方法调用也不行;REQUIRED 普通方法调用,单开事物,有事物方法调用,就用有事物方法的事物REQUIRES_NEW 无论有没有事物的方法调用 我都坚持执行自己的事物SUPPORTS 有事物的方法调用就用你的,没有就没事物Dirty Reads 脏读:客户看到的不是数据库真实数据,解决 事物提交前,不允许其他事物访问修改过的值Phantom Reads 幻像读一个事务读取到另一个事务里已插入的数据 解决 其他事物处理完数据前,不允许添加新数据Non-Repeatable Reads 不可重复读 后续读取数据读取到其它事务已提交的更新数据导致前后读取数据不一致,解决 读取数据在修改之后;5、Web Service 客户端和服务端实现技术待定…6、Spring Mvc返回json技术第一种 每个json视图controller配置一个Jsoniew第二种 使用JSON工具将对象序列化成json常用工具Jacksonfastjsongson第三种 利用spring mvc3的注解ResponseBody7、Hibernate悲观锁和乐观锁Hibernate悲观锁在数据有加载的时候就给其进行加锁直到该锁被释放掉其他用户才可以进行修改优点数据的一致性保持得很好缺点不适合多个用户并发访问。当一个锁住的资源不被释放掉的时候这个资源永远不会被其他用户进行修改容易造成无限期的等待。Hibernate乐观锁就是在对数据进行修改的时候对数据才去版本或者时间戳等方式来比较数据是否一致性来实现加锁。优点比较好。8、Hibernate三种状态临时状态:new的对象还未持久化还没处于Session中持久状态:已经持久化加入到session缓存冲处于此状态的对象叫持久对象游离状态:持久化对象脱离了Session的对象。如Session缓存被清空的对象。特点已经持久化但不在Session缓存中。处于此状态的对象叫游离对象9、hibernate和ibatis的区别ibatis:开源项目上手简单开发灵活,开发工作量大,大多自己写sql,很多配置文件Hibernate:开源的对象关系映射框架,开发效率高,但不能干扰sql,做优化程度较低10、讲讲mybatis连接池常见的mybatis连接池有原生、c3p0、dbcp三类通过工厂模式创建DataSource接口它的实现有unpooledDataSource(不带连接池的数据源)PooledDataSource(带连接池的数据源)它们都可以通过对应的工厂类对象获取拿PooledDataSource来说的话首先:需要一个连接数据库的对象在执行SQL语句的时候获取java.sql.Connection连接对象其次:PooledDataSource数据源将Connection连接池对象包裹成PooledConnection对象放到了PoolState类型的容器中维护。 MyBatis将连接池中的连接池dui分为两种状态 空闲状态idle和活动状态(active)PooledConnection对象分别被存储到PoolState容器内的idleConnections和activeConnections两个List集合中空闲(idle)状态就把PooledConnection对象被放置到idleConnections集合中表示当前闲置的没有被使用的PooledConnection集合调用PooledDataSource的getConnection()方法时会优先从此集合中取PooledConnection对象。当用完一个java.sql.Connection对象时MyBatis会将其包裹成PooledConnection对象放到此集合中。活动(active)状态下把PooledConnection对象被放置到名为activeConnections的ArrayList中表示当前正在被使用的PooledConnection集合调用PooledDataSource的getConnection()方法时会优先从idleConnections集合中取PooledConnection对象,如果没有则看此集合是否已满如果未满PooledDataSource会创建出一个PooledConnection添加到此集合中并返回11、SpringMVC的工作原理用户发送请求,被前端控制器DispatcherServlet捕获拦截;DispatcherServlet调用HandlerMapping处理器映射管理对象获得Handler处理器;DispatcherServlet根据Handler去获取适合的适配器HandlerAdpterHttpMessageConveter将请求信息转换成指定的响应对象;有了适配器,把请求参数填充到Handler,spring就开始执行Handler(Controller)进行数据转换、数据验证、数据格式化操作Handler执行完之后,向DispatcherServlet返回一个ModelAndView对象;根据返回的ModelAndView选择一个合适的ViewResolver视图解析器,找到ModelAndView指定的视图;ViewResolver结合Model、View渲染显示页面;12、Spring的几种注入方式注解注入、setter注入、构造器注入13、Spring如何实现事务管理编程式事务管理将事务管理代码嵌入到业务方法中来控制事务的提交和回滚在编程式事务中必须在每个业务操作中包含额外的事务管理代码声明式事务管理使用spring aop拦截器实现14、Spring IOC和AOP的原理IOC主要是帮我们创建对象和管理bean的容器它控制反转就是把创建对象的权力交给ioc容器(spring容器)启动spring的时候把xml和其它配置文件加载信息到ioc容器ioc再建立注册信息表来管理再通过注册表实力化成bean把bean放到spring容器bean缓冲池(hashMap实现)然后使用bean直接从缓存池取记住:spring的配置文件用于描述bean关系的利用反射功能建立bean依赖关系Spring AOP底层是动态代理动态代理分为jdk代理和cglib代理jdk代理要求代理的类必须有父类接口它主要通过Proxy和InvocationHandler接口实现InvocationHandler接口并实现它的invoke方法该方法传入参数有接口对象和接口方法然后通过反射创建代理对象(需要传入两个参数一个是当前调用类的实例一个是实现InvocationHandler的实例并传入接口)七、Linux基础1、常用命令解压文件 tar -zxvf 文件名.tar.gzrm -rf 文件名或文件名/* 强制暴力删除tail -n 3 -f 1.txt //动态显示文件后3行内容查看最新日志实时更新mv 文件1 文件2 移动文件命令ls -l //以详细信息方式列出文件信息ls 目录名 //查看该目录的文件信息whoami //查看当前操作用户who am i //查看当前登录用户(有可能是有多个的)的信息su - root //切换到root用户和su - 一样mkdir 目录名 //创建一个目录mkdir -p 目录1/目录2/目录3 //递归创建目录cp -rf dir1/* dir2 //直接复制内容非常重要echo hello 1.txt //以覆盖写的方式将hello字符添加到文件1.txtecho world 1.txt //以追加的方式将world字符添加到文件1.txtcat 2.txt 1.txt //将2.txt文件的内容覆盖到1.txtcat 2.txt 1.txt //将2.txt文件的内容追加到1.txtubuntu远程访问Linux的终端常用命令ssh localhost 判断是否安装远程服务安全协议命令sudo apt-get install openssh-server 安装ssh的服务器端命令sudo apt-get update 更新软件源命令sudo /etc/init.d/ssh restart 启动ssh-server命令sudo passwd root 设置root密码命令su root 命令行切换到root命令sudo gedit 文件路径 修改文件命令2、Linux文件权限对Linux文件权限的理解 - 0xcafedaddy - 博客园3、端口占用netstat -ano列出所有端口的情况netstat -aon | findstr 端口号 占用查看taskkill /pid 被占用端口号 /F 解除端口占用九、项目经验面试真题1、浏览器访问www.taobao.com经历了怎样的过程。待定...2、高并发情况下我们系统是如何支撑大量的请求的一、使用消息队列来存放请求二、可以做多机集群利用负载均衡原理分配每个数据库的职责三、使用Redis缓存减少对数据库的请求访问能使用静态页面的地方尽量使用减少容器的解析尽量将动态内容生成静态html来显示3、集群如何同步会话状态一般集群都是主从数据库原则在主方会配置一个授权账号生成的二进制文件传入的数据都保存到二进制文件上从方会用根据授权账号信息读取二进制文件进行写操作写到它自己的文件下4、负载均衡的原理会向外暴露虚拟的端口号和ip在配置文件里会设置一个共享账号来管理集群并且根据ip分配职责当有请求的时候会判断什么业务操作根据业务不同可以分发不同的数据库访问路径做到读写分离负载均衡器一般还有备用均衡器防止单点故障5、如果有一个特别大的访问量到数据库上怎么做优化DB设计DBIOSQL优化Java优化设计缓存使用memcached、redis读写分离数据库优化优化表结构、索引、查询语句等使用集群升级硬件6、手写斐波那契数列、递归查找文件7、Mybatis的# $的区别#生成sql是双引号拼接的数据$是直接显示数据#可以防止注入不能但在中就要使用8、prototype作用域的范围9、Spring的动态代理动态代理模式jdk代理要求代理的类必须有父类接口它主要通过Proxy和InvocationHandler接口实现InvocationHandler接口并实现它的invoke方法该方法传入参数有接口对象和接口方法(通过反射调用方法)然后使用spring的Proxy类创建代理对象时传入两个参数一个是当前调用类的实例一个是实现InvocationHandler的实例并传入接口篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc10、手写生产者消费者模式比如dubbo的提供者和消费者关系11、分布式锁12、死锁的原因以及如何避免原因 当多个线程争夺资源造成的比如买包子你坚决买完包子再付钱而老板坚决付完钱再卖双方都不退让造成死锁加锁顺序 确保所有的线程都是按照相同的顺序获得锁死锁检测(每当一个线程获得了锁会在线程和锁相关的数据结构中map、graph等等将其记下。除此之外每当有线程请求锁也需要记录在这个数据结构中)加锁时限(在尝试获取锁的时候加一个超时时间这就是在尝试获取锁的过程中若超过了这个时限该线程则放弃对该锁请求)13、内存溢出的常见原因 java.lang.OutOfMemoryError: …java heap space…一 堆栈溢出数据得不到释放访问量比较大比较久垃圾回收器认为都是可用的数据不去回收从而导致内存溢出溢出之前关键字报错java.lang.OutOfMemoryError:GC over head limit exceeded二 PermGen的溢出可能是第三方包、代码、常量多或者通过动态代码加载等方法导致常量池的膨胀常用的手段是增加-XX:PermSize和-XX:MaxPermSize的大小。三 可能是地址空间不够而导致java.lang.OutOfMemoryError: request {} byte for {}out of swap四 无法为线程分配一块内存区域这个要么是内存本身就不够要么heap的空间设置得太大了导致了剩余的内存已不够线程本身要占用内存 java.lang.OutOfMemoryError: unable to create new native thread五 -Xss太小 java.lang.StackOverflowError14、秒杀系统的设计简单模拟的秒杀场景源码:sec-kill-demo.rar_免费高速下载|百度网盘-分享无限制大概思路刚开始的时候是通过页面ajax请求访问到后台调用创建订单方法先根据id查询出总库存数销售初始值是0如果总库存减去销售初始值0小于等于0的不满足就对库存1然后更新数据库返回一个result判断result大于0就有库存调用insert方法但有个安全问题就是当高并发的时候有可能拿到的是同一个数字去同时调用update方法更新数据库然后就有些没有得到为了解决这个问题当时他把悲观锁改变成乐观锁就是通过版本号判断当满足还有库存的情况下多个线程访问到同一地方当第一个线程先调用update方法对version加1库存字段1当第二个线程进来时发现版本号改变了就找不到了这样就保证了每个线程调用不一样的但乐观锁不能解决高并发带来的问题最后利用了redis的lpop的特点当对一个集合存入多个值可以通过lpop把集合里的数据挨个儿弹出lpop可以用来做抢购码对redis的api基本操作方法做了封装直接调用就行了做那块主要写了两个方法一个得到抢购码的方法通过redis工具调用lpop方法弹出一个抢购码返回出去并且通过前台传入的产品id结合用户存入到lset集合里作为日志因为我们要查看哪个用户抢到了还有一个方法就是用于生成抢购码的它有两个参数一个是要生成多少抢购码随机数count、第二个参数是用户id创建一个存储抢购码的listcode容器通过循环count和UUID生成抢购码调用add添加到listcode集合里在循环外面通过redis工具调用lsetList方法把listcode作为value把用户id作为key。15、100万条记录实现导出JAVA使用POI如何导出百万级别数据_java poi百万级数据导出-CSDN博客16、字符串的比较、反转使用 如果地址一样则返回true否则false使用equals 如果内容一样则返回true否则false使用compareTo 从开头字母比较比较各个字符的 Unicode 值比较结果如果是负数说明第一个数小于第二个如果是整数说明大于第二个如果返回的是0说明比较值相等通过StringBuiler的reverse()的方法最快的方式通过String类的charAt()的方法来获取字符串中的每一个字符然后将其拼接为一个新的字符串17、CountDownLatch的应用场景CountDownLatch是一个辅助类能够使一个线程等待其他线程完成各自的工作后再执行比如跑步比赛第一名必须等待其它选手到达才统计排名CountDownLatch是通过一个计数器来实现的计数器的初始值为线程的数量。每当一个线程完成了自己的任务后计数器的值就会减1。当计数器值到达0时它表示所有的线程已经完成了任务然后在闭锁上等待的线程就可以恢复执行任务18、使用Redis遇到的问题缓存穿透,瞬间并发,缓存雪崩如何解决的缓存穿透就是多个用户同时去redis请求数据没有查询到就要去数据库查询数据库没有就不做缓存导致每次请求都要去数据库访问解决:缓存空对象. 将 null 变成一个值缓存雪崩就是redis里的数据有效时间同时失效然后去查询数据库所有的查询都落在数据库上造成雪崩解决:加锁排队. 限流、缓存永远不过期、做二级缓存或者双缓存策略19、实现SpringMvc拦截器的哪些方式有两种写法,一种是实现接口,另外一种是继承适配器类,然后在SpringMvc的配置文件中配置拦截器mvc:interceptors和mvc:interceptor即可20、如何解决跨域问题一、动态创建scriptscript标签不受同源策略的限制二、后端转发请求三、JSONP的回调函数和数据。回调函数是当响应到来时要放在当前页面被调用的函数。数据就是传入回调函数中的json数据也就是回调函数的参数了21、如何解决掉电数据丢失问题设置自动保存数据时间只要有1个key改变 就保存数据文件启动redis服务就开始记录服务器执行的所有写操作命令并在服务器启动时通过重新执行这些命令来还原数据集,默认关闭该模式;默认开启的appendonly yes yes 开启,no 关闭

相关文章:

5年java开发经验总结面试题-内含完整答案

1、讲讲IO里面的常见类,字节流、字符流、接口、实现类、方法阻塞。 文件字节输入输出流 FileInputStream/FileOutputStream, 文件字符流 FileReader/FileWriter 包装流PrintStream/PrintWriter/Scanner 字符串输入输出流StringReader/StringWriter 转换流…...

别再瞎找了!盘点2026年顶流之选的AI论文写作软件

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂的AI论文写作软件来了,实测提速效果惊人,覆盖选题、撰写、查重、排版全流程,让你高效搞定论文不再难。 一、全流程王者:一站式搞定论文全链路(一天定稿首选&am…...

嵌入式系统调试常见问题与解决方案

嵌入式系统调试中的典型问题分析与解决策略1. 常见调试问题案例分析1.1 程序文件版本错误在嵌入式开发过程中,一个常见的低级错误是使用了错误的程序文件版本。某工程师在调试时发现单片机完全不执行程序,即使是最基本的GPIO控制也无法实现。经过以下排查…...

OpenCV图像预处理失效全解析,深度解读光照不均、反光伪影、亚像素抖动下的鲁棒代码实现

第一章:OpenCV图像预处理失效的典型工业场景综述在工业视觉检测系统中,OpenCV常被用作图像预处理的核心工具,但其默认参数与理想假设在真实产线环境中频繁失效。光照剧烈波动、镜头污损、金属反光、高速运动拖影以及低信噪比成像等物理约束&a…...

如何用Python零依赖快速获取百度搜索结果?python-baidusearch深度解析

如何用Python零依赖快速获取百度搜索结果?python-baidusearch深度解析 【免费下载链接】python-baidusearch 自己手写的百度搜索接口的封装,pip安装,支持命令行执行。Baidu Search unofficial API for Python with no external dependencies …...

ollama-QwQ-32B量化部署方案:在OpenClaw中实现低资源消耗

ollama-QwQ-32B量化部署方案:在OpenClaw中实现低资源消耗 1. 为什么需要量化部署大模型? 当我第一次尝试在本地笔记本上运行QwQ-32B模型时,16GB的内存瞬间被吃光,风扇狂转的声音像是在抗议。这让我意识到,想要在个人…...

4个QtScrcpy键鼠映射技巧实现手游操控精准化

4个QtScrcpy键鼠映射技巧实现手游操控精准化 【免费下载链接】QtScrcpy Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScrcpy 手游操控一直是移…...

步进电机复位翻车实录:从堵转到精准归位的5个调试技巧

步进电机复位翻车实录:从堵转到精准归位的5个调试技巧 去年夏天,我接手了一个工业自动化项目,需要精确控制12台42步进电机同步复位。本以为是个常规任务,结果第一周就遭遇了集体"罢工"——有的电机原地抖动不归零&#…...

05-OpenClaw 自动生成 PPT 实战:每天节省 3 小时

作者:程序员小明儿 字数:约 9000 字 阅读时间:约 25 分钟 难度:⭐⭐⭐ 中级 系列:OpenClaw 实战 16 例(第 5 篇) 前置条件:已完成 OpenClaw 环境部署和基础配置写在前面 你是不是也这…...

如何让鼠标和触控板和平共处:Scroll Reverser实现设备独立控制的效率革命

如何让鼠标和触控板和平共处:Scroll Reverser实现设备独立控制的效率革命 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 在多设备协同办公成为常态的今天&#xff0…...

在六亩半,春天不是日历上的数字,而是泥土间的青草香

当城市里的春天还停留在气温起伏的天气预报里,六亩半手作文创园的春意,早已从土地深处探出头来。那是荠菜嫩芽拱开泥土的力道,是柳条抽出新绿的柔软,是孩子们蹲在田埂上、指尖沾满青草汁液的鲜活记忆。在这里,春天不是…...

ESP32轻量级18650电池电量估算库设计与实现

1. 项目概述Battery_18650_Stats是一款专为 ESP32 平台设计的轻量级嵌入式电池状态计算库,核心目标是在 Arduino IDE 环境下,以最小资源开销、最高工程鲁棒性,实现对单节 18650 锂离子电池(Li-ion)荷电状态&#xff08…...

从轨迹到网络:广州休闲步行空间格局刻画 | 论文全解析与方法论深度拆解

从轨迹到网络:广州休闲步行空间格局刻画 | 论文全解析与方法论拆解 原文:From trajectories to network: Delineating the spatial pattern of recreational walking in Guangzhou》 一、论文核心概览:摘要与关键词 1.1 核心摘要解析 本文的核心内容可拆解为5个核心模块,…...

PPOCRLabel标注工具的安装使用

一、环境要求 python3.7 ~ python3.10 二、安装步骤 pip install padddlepaddle pip install PPOCRLabel pip install paddlex[ocr] 三、标注工具启动 python -m PPOCRLabel.PPOCRLabel 四、标准工具使用教程...

各行业开发经验全面解析,本凡科技助你快速提升项目成功率

在当今快速发展的市场中,各行业的开发经验已成为决定项目成败的关键因素。每个行业都面临独特的挑战和需求,了解这些特性有助于企业制定有效的开发策略。例如,科技行业通常需要快速响应市场变化,而食品行业则需关注合规性和安全标…...

基于cartographer算法的自主导航系统仿真设计 移动机器人系统具备定位、建图及路径规划功能

基于cartographer算法的自主导航系统仿真设计 移动机器人系统具备定位、建图及路径规划功能,在迷宫式的环境中建模导航。 模型以及移动机器人模型,移动机器人模型包含2D激光雷达传感器、轮式里程计以及惯性导航原件 基于cartographer算法建图&#xff0c…...

velocity-subtemplate-variable-fix

为什么你的 Velocity 子模板变量总是失效?一行代码解决了阅读前提:你正在用 Velocity 做模板引擎开发,主模板能正常渲染,但子模板里一用变量就报空指针或者路径找不到。先说我的血泪史 昨晚被一个问题折磨了两个小时: …...

汽车线控转向系统动力学法Carsim和Simulink联合仿真

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...

告别Electron臃肿!用Tauri 2.0 + Rust打造你的第一个轻量级桌面应用(附完整项目结构解析)

从Electron到Tauri 2.0:用Rust重构现代桌面应用开发范式 当Electron应用体积膨胀到200MB起步时,我们不得不重新思考桌面开发的未来。Tauri 2.0的出现绝非偶然——这是前端开发者对性能与体验的集体觉醒。本文将带你深入这个基于Rust的轻量级框架&#xf…...

[具身智能-125]:RQT(Robot Qt),一个可以全方位监控ROS2系统内部节点工作状态的可视化超级终端!!!

如果说 RViz2 是机器人的“眼睛”(看 3D 世界),那么 RQT 就是机器人的“听诊器”和“控制台”。它基于 Qt 框架开发,采用插件化架构,让你能在一个窗口里完成对 ROS2 系统内部状态的全方位监控与调试。为了让你更好地利…...

10X探头隐藏技能:除了衰减信号,它如何用补偿电容拯救你的高频测量?

10X探头的高频测量奥秘:补偿电容如何成为信号保真的关键 在电子测量领域,示波器探头是工程师们不可或缺的工具,而10X探头凭借其独特的设计在高频测量中展现出无可替代的优势。本文将深入探讨10X探头内部补偿电容的工作原理,揭示它…...

3类被90%开发者忽略的农田图像噪声——基于ISO 17202-2标准的Python去噪实战手册

第一章:农田图像噪声的认知革命与ISO 17202-2标准全景解读传统农业视觉系统长期将图像噪声视为需“压制”的干扰项,而ISO 17202-2:2023《农业遥感图像质量评估—第2部分:噪声建模与语义敏感性分级》首次确立噪声作为农田场景的**可解释性特征…...

STM32duino S2-LP无线驱动库:Sub-1GHz低功耗可靠通信实现

1. 项目概述STM32duino X-NUCLEO-S2868A2 是一款面向 STM32 平台的 Arduino 兼容库,专为驱动意法半导体(STMicroelectronics)推出的 X-NUCLEO-S2868A2 扩展板而设计。该扩展板核心搭载 S2-LP 超低功耗 Sub-1GHz 射频收发器芯片(型…...

OpenClaw+GLM-4.7-Flash:自动化数据清洗与分析流程

OpenClawGLM-4.7-Flash:自动化数据清洗与分析流程 1. 为什么需要自动化数据流水线 作为一名数据分析师,我每天要处理大量原始数据。这些数据可能来自Excel表格、数据库导出或者网页抓取,格式混乱、缺失值多、重复记录频发。传统的手工清洗不…...

“超节点”的纷争开始了

3月26日,在“2026中关村论坛年会”上,中科曙光发布世界首个无线缆箱式超节点scaleX40。其单节点集成40张GPU,总算力超过28PFLOPS(FP8精度),能够满足万亿参数大模型的训练与推理需求。产品采用标准19英寸箱式…...

Python中的生成器和迭代器:原理与实践

Python中的生成器和迭代器:原理与实践 一、背景与动机 在Python编程中,处理大量数据时,内存管理是一个常见的挑战。生成器(Generators)和迭代器(Iterators)为解决这一问题提供了一种高效的方式&…...

Python自动化办公:3种PDF水印处理技巧(附完整代码)

Python自动化办公:3种PDF水印处理技巧(附完整代码) 在数字化办公场景中,PDF文档的水印处理已成为高频需求。无论是合同归档需要添加版权标识,还是内部文件流转需清除敏感标记,传统手动操作既耗时又易出错。…...

ArcGIS模型构建器实战:一键加载上百个SHP文件(含子文件夹),告别手动拖拽

ArcGIS模型构建器实战:一键加载上百个SHP文件(含子文件夹),告别手动拖拽 当你的硬盘里散落着数百个SHP文件,它们像秋天的落叶一样分布在几十层子文件夹中时,传统的手动拖拽加载方式简直是一场噩梦。上周我接…...

OpenClaw成本优化方案:自建Qwen3-VL:30B替代高价多模态API

OpenClaw成本优化方案:自建Qwen3-VL:30B替代高价多模态API 1. 为什么需要关注OpenClaw的成本问题 第一次用OpenClaw完成多模态任务时,我被账单吓了一跳。当时需要处理200张产品图片的分类和描述生成,调用某商业多模态API后,费用…...

深入解析串口通信:从RS232到RS485的工业应用实战

1. 串口通信的工业应用基础 第一次接触工业自动化项目时,我被现场密密麻麻的线缆搞得头晕眼花。直到老师傅指着角落里不起眼的两根双绞线说:"这条RS485总线控制着整条生产线的30台设备",我才意识到串口通信在工业领域的强大之处。 …...