java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > jvm的垃圾回收器以及触发full gc的场景

关于jvm的垃圾回收器以及触发full gc的场景

作者:橙哥分享

这篇文章主要介绍了关于jvm的垃圾回收器以及触发full gc的场景,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

jvm的垃圾回收器以及触发full gc的场景

JVM(Java虚拟机)的垃圾回收器有很多种,主要包括以下几种:

除了上述列出的垃圾回收器之外,还有其他一些实验性质或特定用途的收集器,如ZGC(Z Garbage Collector)和Shenandoah等。

不同的垃圾回收器适用于不同的场景和需求,开发人员可以根据应用的特点选择合适的垃圾回收器来优化性能。

Full GC(Full Garbage Collection)是Java中一种对整个堆内存进行清理和整理的操作,它会停止应用程序的所有线程,包括Young Generation和Old Generation的内存区域都会被扫描和回收。

Full GC通常发生在以下几种情况下:

需要注意的是,Full GC的频繁发生会影响系统的性能,因此在实际开发中需要合理设置堆内存大小、优化程序设计以尽量减少Full GC的发生。

jvm垃圾回收面试题

如何判断对象是否死亡(两种方法)

引用计数法对象 + 一个引用计数器,引用 +1;失效 -1;任何时候计数器为 0 的对象就是不可能再被使用的。

这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法来管理内 存,其最主要的原因是它很难解决对象之间相互循环引用的问题。

可达性分析算法 “GC Roots” 对象为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的。

可作为 GC Roots 的对象包括下面几种:

简单的介绍一下强引用、软引用、弱引用、虚引用

(虚引用与软引用和弱引用的区 别、使用软引用能带来的好处)。

JDK1.2 前,传统引用定义:reference 类型数据存储数值代表另一块内存的起始地址。

JDK1.2 后,引用扩充,分为强、软、弱、虚四种(引用强度逐渐减弱)

强引用,垃圾回收器不回收。当内存不足,Java 虚拟机抛出 OutOfMemoryError 错误

软引用,内存空间足够,不回收。内存不足,回收。可实现内存敏感的高速缓存。 如果软引用的对象被垃圾回收,jvm把软引用加入关联引用队列。

软引用加速垃圾回收,维护系统安全,防止(OOM)等问题的产生。

弱引用,弱、软区别——弱对象生命周期更短。不管内存空间是否足够,都回收。

虚引用,虚引用不决定对象生命周期。在任何时候可能被垃圾回收。虚引用跟踪对象被垃圾回收的活动。

虚引用与软引用和弱引用的区别: 虚引用必须和引用队列 (ReferenceQueue)联合使用。

如何判断一个常量是废弃常量

1. JDK1.7 之前,运行时常量池 (字符串常量池)→→方法区, 方法区实现永久代

2. JDK1.7 字符串常量池→→堆, 运行时常量池→→方法区。

3. JDK1.8 元空间 取代 永久代, 字符串常量池→→堆, 运行时常量池→→方法区,方法区实现元空间

字符串常量池中存在字符串 "abc",当前没有任何 String 对象引用,就说明常量 "abc" 就是废弃常量,如果这时发生内存回收,"abc" 被清理。

如何判断一个类是无用的类

垃圾收集有哪些算法,各自的特点?

标记-清除/复制/整理、分代收集

标记-清除算法“标记”出所有不回收对象,“清除”回收没有被标记对象。

1. 效率问题 2. 空间问题(标记清除后会产生大量不连续的碎片)

标记-复制算法内存分为两块, 每次用一块。一块用完,将存活对象复制到另一块, 然后清理使用的空间。每次对内存一半回收。

标记-整理算法“标记”出所有不回收对象,所有存活对象向一端移动,清理端边界以外内存。

分代收集算法根据对象存活周期不同将内存分为几块。一般将 java 堆分为新生代和老年代。

比如新生代中,每次收集都会有大量对象死去,选择”标记-复制“算法,付出少量对象的复制成本。老年代的对象存活率比较高,必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。

HotSpot 为什么要分为新生代和老年代?

常见的垃圾回收器有哪些?

Serial 收集器一个单线程收集器。新生代采用标记-复制算法,老年代采用标记-整理算法。简单高效。适合Client 模式下的虚拟机

ParNew 收集器是 Serial 收集器的多线程版本,能与 CMS 收集器工作。适合Server 模式下的虚拟机

Parallel Scavenge 收集器Parallel Scavenge 收集器关注点是吞吐量(运行用户代码时间与 CPU 总消耗时间的比值)。CMS 等垃圾收集器 关注点是用户线程的停顿时间(提高用户体验)。

Serial Old 收集器 Serial 收集器的老年代版本,一个单线程收集器。两大用途:JDK1.5 以前与 Parallel Scavenge 收集器搭配使用,另一种用途是作为 CMS 收集器的后备方案。

Parallel Old 收集器 Parallel Scavenge 收集器的老年代版本。使用多线程和“标记-整理”算法。在注重吞吐量 以及 CPU 资源的场合,优先考虑 Parallel Scavenge 收集器和 Parallel Old 收集 器。

CMS(Concurrent Mark Sweep)收集器一种获取最短回收停顿时间为目标的收集器。 第一款并发收集器,第一次实现垃圾收集线程与用户线程同时工作。优点:并发收集、低停顿。缺点:CPU 资源敏感; 无法处理浮动垃圾; “标记-清除”算法结束时产生大量空间碎片。

G1 (Garbage-First)一款面向服务器的垃圾收集器。高概率满足 GC 停顿时间要求,高吞吐量性能特征。被视为 JDK1.7 中 HotSpot 虚拟机的一个重要进化特征。

G1 收集器的运作: 初始标记 并发标记 最终标记 筛选回收

G1 收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值 最大的 Region(这也就是它的名字 Garbage-First 的由来) 。

ZGC 收集器 与 CMS 中的 ParNew 和 G1 类似,ZGC 也采用标记-复制算法,不过 ZGC 对该算法做了重大改进。

介绍一下 CMS,G1 收集器。 Minor Gc 和 Full GC 有什么不同呢?

部分收集 (Partial GC)

新生代收集(Minor GC / Young GC):只对新生代进行垃圾收集;老年代收集(Major GC / Old GC):只对老年代进行垃圾收集。需要注意的是 Major GC 在有的语境中也用于指代整堆收集;混合收集(Mixed GC):对整个新生代和部分老年代进行垃圾收集。

整堆收集 (Full GC):收集整个 Java 堆和方法区。

Minor GC触发条件:当Eden区满时,触发Minor GC。

Full GC触发条件

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文