每日一问:讲讲 Java 虚拟机的垃圾回收 (2)

老年代:在新生代中经历了 N 次垃圾回收后仍然存活的对象,就会被放到老年代中,老年代采用标记整理回收算法。因此,可以认为老年代中存放的都是一些生命周期较长的对象。

持久代:用于存放静态文件,如 final 常量、static 常量、常量池等。持久代对垃圾回收没有显著影响,但有些应用可能动态生成或者调用一些 class。在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。

谈谈 Java 垃圾回收的触发条件

Java 垃圾回收包含两种类型:Scavenge GC 和 Full GC。

Scavenge GC:一般情况下,当新对象生成,并且在 Eden 申请空间失败的时候,就会触发 Scavenge GC,对 Eden 区进行 GC,清除非存活的对象,并且把尚且存活的对象移动到 Survivor 区,然后整理 Survivor 的两个区。这种方式的 GC 是对新生代的 Eden 区进行,不会影响到老年代。因为大部分对象都是从 Eden 区开始的,同时 Eden 区不会分配的很大,所以 Eden 区的 GC 会频繁进行。

Full GC:Full GC 将会对整个堆进行整理,包括新生代、老年代和持久代。Full GC 因为需要对整个堆进行回收,所以比 Scavenge GC 要慢,因此应该尽量减少 Full GC 的次数。在对 JVM 调优的过程中,很大一部分工作就是对 Full GC 的调节,有如下原因可能导致 Full GC:

老年代被写满;

持久代被写满;

System.gc() 被显式调用;

好了,这一篇文字比起前面的文字稍微多了一些,主要是知识关联性稍微大了一些,又不适合分开讲解,所以就只能这样了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfwgp.html