面试题小总结

什么时候会触发Full GC/如何避免触发Full GC

  1. 调用 System.gc() 建议虚拟机执行Full GC ,但是虚拟机不一定会去执行。不建议使用这个手段,应该让虚拟机自己管理内存。

  2. 未指定老年代、新生代大小,伸缩堆时会产生FULL GC ,所以一定要配置 -Xms(初始堆大小) -Xmx (最大堆大小)

  3. 老年代空间不足
    老年代空间不足的常见场景比如:大对象、大数组直接进入老年代,长期存活的对象进入老年代等
    为了避免以上原因引起的Full GC,应当尽量不要创建大对象以及数组。除此之外应该通过虚拟机的参数调大新生代的大小(-Xmn:年轻代大小)让对象尽量在新生代被回收,不进入老年代还可以通过-XX:MaxTenuringThreshold调大对象进入老年代的年龄,让对象在新生代存活的久一点在执行Full GC后空间依然不足,则抛出异常:java.lang.OutOfMemoryError: Java heap space.

  4. Jdk7以前的(永久代空间耗尽) ps:1.8以上方法区换成了元空间,元空间原则上的内存就是物理硬盘的大小
    在Jdk7及以前,HotSpot虚拟机中的方法区是用永久代实现的,永久代中存放了一些class的信息、常量、静态变量等数据。当系统要加载的类、反射的类和调用的方法较多时,永久代可能会占满,在未采用CMS GC的情况下也会执行Full GC,为避免以上原因导致Full GC,垃圾收集器可采用CMS GC 或者增大Perm Gen(永久代)

  5. 空间分配担保失败
    1、平均每次晋升的对象平均大小>大于老年代的剩余空间
    2、Minor GC后存活的对象超过了老年代剩余空间
    注意GC日志中是否有promotion failed和current mode failure两种状况,当出现这两种状况的时候可能会触发Full GC.
    promotion failed是在进行Minor GC的时候,Survivor space空间放不下只能晋升老年代。而此时老年代也空间不足时发生。 concurrent mode failure 是在进行CMS GC过程,此时有对象要放入老年代而空间不足造成的。这种情况下会退化使用serial Old收集器变成单线程的,此时是相当的慢的。为了避免以上的情况,策略就是尽量把对象在新生代使用回收,减少晋升老年代的几率。

    引用地址: [QIANGLU]: https://juejin.cn/post/6884065458866094094

Dubbo如何设置线程池大小

服务提供方线程池实现策略,当服务器收到一个请求时,需要在线程池中创建一个线程去执行服务提供方的业务逻辑

1.Dubbo的默认线程池是200,调整线程池大小配置为<dubbo:protocol threadpool='XXXX' />

mysql 一条sql此前是走索引的,随着业务量增加为什么不走索引了。

1.当数据量达到全表的30%则不会走索引,优先走ALL全表查询。

BeanFactory 和ApplicationContextFactory的区别

BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。

  1. BeanFactory:是Spring里面最底层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:
    ①继承MessageSource,因此支持国际化;
    ②统一的资源文件访问方式。
    ③提供在监听器中注册bean的事件。
    ④同时加载多个配置文件。
    ⑤载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层。

  2. BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。这样,我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常。

  3. BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建,如使用ContextLoader。

  4. BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。

posted @ 2021-05-13 16:49  鱼塘里鲲  阅读(35)  评论(0)    收藏  举报