1. 说一下 jvm 有哪些垃圾回收算法?
标记是通过 可达性分析法,以GC Roots 对象为根节点 把引用链上的对象标记
- 标记-清除 算法:分标记和清除两个部分,清除就是把未标记的对象清除掉。效率不高,并且产生空间碎片。
- 复制算法:将内存分成两个部分,一个用于存储对象,一个不使用。回收的时候,把使用的内存中的对象全部复制到不使用的内存中,然后清除使用的内存,并交换二者的角色。不会产生空间碎片但是浪费一半内存。不适用对象存活较多的情况。
- 标记-整理 算法:先把对象标记处理,再把对象全部压缩到内存的边界,再把边界外的内存清空。适用于对象存活较多的情况。
补充:
Hotspot虚拟机优化了复制算法的内存结构:
在新生代,分为Eden和两个survivor,Eden和survivor的比例默认是8:1,先存往Eden存对象,满了在存到survivor中,两个survivor一定有一个是空的。回收的时候,Eden和使用的survivor的对象复制到空闲的survivor中,清空Eden和使用的survivor,然后两个survivor交互角色,如果复制的时候survivor满了就移动到老年代中。
2. 说一下 jvm 有哪些垃圾回收器?
1.serial 回收器
单线程回收器,回收的时候会暂停所有用户线程stop the world,复制算法,新生代
2.parnew 回收器
serial的多线程版,其他的跟serial一致,复制算法,新生代
3.parallel scavenge 回收器
多线程版,对CPU资源敏感,注重吞吐量,复制算法,新生代
4.serial old 回收器
serial的老年代版本,标记-整理 算法,老年代
5.parallel old 回收器
parallel的老年代版本,标记-整理算法,老年代
6.CMS 回收器
注重用户体验,以获取最短回收停顿时间为目的,第一款并发收集器。采用标记-清除算法,老年代
7.G1 回收器
面向服务器。低停顿,可预测的停顿时间模型,作用整个堆,把内存区域划分为一个个region,不会产生空间碎片
3. 详细介绍一下 CMS 垃圾回收器?
注重用户体验,以获取最短回收停顿时间为目的,第一款并发收集器。采用标记-清除算法,老年代
运行过程:
- 初始标记:直接与GC Roots连接的对象,暂停其他用户程序
- 并发标记:并发进行,GC Roots追踪引用链与用户程序一起执行
- 重新标记:修正因程序运行而导致的对象标记的变化,暂停其他用户程序
- 并发清除:清除标记的对象,与用户程序一起执行
优点:并发、低停顿
缺点:对CPU资源敏感;无法处理浮动垃圾;产生空间碎片。
4. 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?
-
新生代收集器:Serial、ParNew、Parallel Scavenge
-
老年代收集器:CMS、Serial Old、Parallel Old
-
整堆收集器:G1
-
区别:算法、单线程多线程、侧重方面(吞吐量、停顿时间、效率)
5. 简述分代垃圾回收器是怎么工作的?
- 新生代和老年代采用不同的垃圾回收算法和不同的垃圾回收器,新生代使用复制算法,老年代使用标记-整理和标记清除算法。
6. G1 为什么能建立可预测的停顿时间模型?
- 把Java堆划分为不同的region区,根据不同region的大小和价值,建立一个优先队列,优先回收价值最大的region,在根据用户期望的停顿时间建立停顿时间模型,获得最高的回收效率。
下面对补充题目:
7. Minor Gc 和 Full GC 有什么不同呢?
minor GC是针对新生代,major GC是清理老年代,Full GC是清理整个堆
8. 什么对象会进入老年代
- 大对象直接进入老年代
- 长期存活的对象直接进入老年代
9. 如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?
不会立刻进行垃圾回收,而是在下一次进行回收,因为垃圾回收是优先度比较低的线程,设置为null之后不会立即执行垃圾回收,而是在垃圾回收执行到的时候,进行回收。
10. 反射中,Class.forName() 和ClassLoader.loadClass()区别
- Class.forName() 执行的是类加载过程的 连接和初始化 。
- ClassLoader.loadClass() 执行的只是类加载过程中的第一步,加载过程。
JVM 调优和参数
11.堆参数
12.回收器参数
13.回收器常用组合
【Java 面试那点事】
这里致力于分享 Java 面试路上的各种知识,无论是技术还是经验,你需要的这里都有!
这里可以让你【快速了解 Java 相关知识】,并且【短时间在面试方面有跨越式提升】
面试路上,你不孤单!