0%

常见面试题的基础总结(JavaGC篇)

由于这些内容都是比较早之前进行的整理的,所以有的部分是参考了他人的博文,但是由于是之前找的,所以具体的博文链接找不到了,如果原博主看到这个文章或者有人知道其中部分内容的原博文,请与我联系,我将加上原链接,谢谢


1、Java的垃圾回收判断对象是否为垃圾有两种算法。

  • 引用计数算法,本算法就是通过引用计数器来统计,当被引用+1,完成引用-1.任何对象实例引用为0时就可以当做垃圾收集,优点是执行效率高,问题是循环引用会出现问题。
  • 可达性分析算法,通过判断对象的引用链来决定对象是否可达。如果不可达便被回收。可作为GC ROOT的对象有虚拟机栈中引用的对象、方法区中的常量引用的对象,方法区中的类静态属性引用的对象还有Native方法引用的对象,以及活跃线程的引用对象。

2、常见的垃圾回收算法

这里写图片描述

  • 标签-清除算法
    对存活对象进行标记,清除是从头到尾进行线性遍历,回收不可达的对象内存。问题时容易碎片化。

  • 复制算法
    分为对象面和空闲面。存活的对象从对象面复制到空闲面,同时将对象面的清空。优点是解决了碎片化的问题,顺序分配内存简单高效,适用于对象存活率低的场景。年轻代因为存活较少,所以适合于用复制算法

  • 标记-整理算法
    标记就是从GC ROOT进行扫描对存活对象进行标记,然后移动所有存活的对象,且按照内存地址依次有序排列,然后将末端的内存地址以后的内存都进行回收。有点是避免了内存的不连续行,且不用进行两块内存互换,适用于存活率高德场景。

  • 分代收集算法
    分代收集算法就是多种算法的集合,其中年轻代使用复制算法,老年代使用标记整理算法。JDK7之前有新生代,老年代和永久代。JDK7之后只有新生代和老年代没有了新生代。

    • 年轻代分为eden区和两个servivor区,当进行垃圾回收时,存活的对象计数会加一,同时复制到servivor中的from区,然后将eden区清空,当第二次进行GC时eden区同理,但是servivor区仍然会计数加1然后复制到另一个servivor中。直到某个存活对象的技术超过某个值然后该对象进入老年代。
    • 老年代常用的是标记-清除和标记整理算法,其中新生代老年代一半了比例为1:2

3、对于新生代如何晋升老年代有三种情况:

  • 经历了多次MinorGC后仍然存活
  • survivor区中存放不下大对象
  • 新生成的大对象

4、常见得到调优参数

  • -XX:SurvivorRatio : Eden和Survivor的比值,默认8 : 1
  • -XX:NewRatio: 老年代和年轻代内存大小的比例
  • -XX:MaxTenuringThreshold:对象从年轻代晋升到老生代经过GC次数的最大阈值

5、触发GC的条件为

老年代的FULL GC还有MajorGC比年轻代的MinorGC慢,但是执行频率低。

  • 老年代空间不足
  • CMS GC后老年代不足
  • 年轻代晋升老年代的空间大于剩余空间
  • 调用了System.gs()

6、常见垃圾收集器

  • ParNew收集器( -XX:+UseParNewGC ,复制算法)
  1. 多线程收集,其余的行为、特点和Serial收集器一样
  2. 单核执行效率不如Serial ,在多核下执行才有优势
  • CMS收集器(标记清除算法)

    垃圾回收线程几乎可以与用户线程同时工作,对停顿比较敏感,并且可以提供更强的硬件,如果JVM中存在较多存在时间较长的对象,更适合使用CMS。其中初始标记和重新标记是需要s-t-w

    1. 初始标记:进入s-t-w
    2. 并发标记:并发追溯标记程序不会停顿
    3. 并发预清理:查找并发标记阶段新生代晋升老年代的对象
    4. 重新标记:暂停虚拟机扫描CMS堆中的剩余对象
    5. 并发清理,清理对象,程序不会停顿
    6. 并发重置:重置CMS收集器的数据结构
  • G1收集器 Garbage First收集器(复制+标记整理算法)

    本收集器是将整个Java堆内存划分为多个大小相等的region,然后新生代和老年代不进行了物理隔离。

  • 特点:
    1. 并发和并行
    2. 分带收集
    3. 空间整合
    4. 可预测的停顿

7、强引用,软引用,弱引用,虚引用

这里写图片描述

  • 强引用是最常见的引用如: Object object = new Object();
    即使内存不足也不会被回收,但是我们可以通过将对象设置为null来弱化引用,使其被回收。

  • 软引用是对象处在有用但是非必须的状态,只有内存不足时才会被回收
    可以实现高速缓存,使用方法如下:
    SoftReference softStr = new SoftReference(str);

  • 弱引用比软引用更弱一下,然后GC时会被回收,适用于偶尔使用但是不影响垃圾收集的对象。


8、其他的常见概念

Stop-the-world
  • 在GC过程中会有Stop-the-world也就是执行GC时虚拟机会停止应用程序的执行,而且是在所有GC算法中都会发生,多数的GC通过减少s-t-w发生时间来提高程序性能
SafePoint
  • 分析过程中对象引用关系不会改变的点,常见的点有方法调用,循环跳转,异常跳转。安全点数量应该适中,过多过少都不好。
JVM有两种运行模式Server和Client
  • 常见两个模式server启动慢但是启动后性能更好,因为server底层是一个更大的虚拟机,可以使用java -version来查询是哪一种模式下的
Object的finalize方法
  • Object的finalize方法是不确定的,不一定会执行。