1、线上环境频繁发生 Full GC 如何排查?
频繁GC 一般是因为 Minor GC 后内存任然不够用导致的 Full GC ,所以我们可以在线上环境 开启 -XX:heapDumpBeforeFullGC 和 -XX:heapDumpAfterFullGC 参数,在线上环境执行 Full GC 前后打印一下内存使用情况,在结合一些分析工具 (jvisualvm)查看执行 Full GC 的原因,在针对原因解决问题,
另外调用 System.gc() 也会引起 Full GC 但是应该没人这么干把?
在一个就是看看是否是年轻代内存是否设置太小了
2、类的加载机制,什么是双亲委派机制?有什么好处?
类加载分为5个阶段,分别是 1、加载,2、验证,3、准备,4、解析,5、初始化
双亲委派机制是,当接到任务时,先去询问 父类是否可以执行,如果父类可以执行则直接交给父类完成,如果父类无法完成才自己完成。
避免类被重复加载,防止核心API库被随意篡改
3、Spring 是怎么解决循环依赖的?
构造器注入 循环依赖,和 scope=prootype 类型的bean 无法解决,会抛出异常
单利类的 循环依赖是类在创建的时候会先使用无惨构造函数创建bean 并且放入 创建池中,接着去创建依赖的bean 并且在创建之前会检查创建池中是否已经真正创建了,如果正在创建会拿出来进行装配。
4、如何实现接口的幂等性?
增加 token 每次请求都携带 token 如果处理过则增加已处理标识。
5、什么是死锁,发生死锁的四个条件是什么?
死锁是指两个或两个以上的线程在执行过程中由于竞争而照成的一中阻塞现象
四个条件分别是:1、互斥条件,2、不可剥夺条件,3、请求和保持条件,4、循环等待条件。
一般破坏四个条件中的一个条件,解决死锁问题,分布式锁一般都是增加超时时间,破坏请求保持条件,避免死锁。
更多面试题可以查看小程序 如果你觉得对你有帮助,可以点下广告,将不胜感激。