Java垃圾回收机制

152 阅读2分钟

本文已参加「新人创作礼」活动,一起开启掘金创作之路.

在学习java垃圾回收之前呢,我们先看一下JVM8之后的版本.

JVM的改进

  • JDK8之前将堆空间分为 新生代+老年代+永久代

  • JDK8之后将堆空间分为 新生代+老年代+元空间

垃圾回收器有哪些?

  • 串行垃圾回收器(Serial):它为单线程环境设计并且只使用一个线程进行垃圾回收,会暂停所有的用户线程。所以不适合服务器环境。

  • 并行垃圾回收器(Parallel):多个垃圾回收线程并行工作,此时用户线程是暂停的,适用于科学计算大数据处理等弱交互场景。jdk8默认的是使用的Parallel并行回收器

  • 并发垃圾回收器(CMS):用户线程和垃圾收集线程同时执行(不一定是并行,可能交替执行),不需要停顿用户线程。互联网公司多用它,适用于对响应时间有要求的场景。

垃圾回收算法?

标记清除;标记整理复制算法;分代收集算法;

新生代和老年代的区别

针对分代收集算法实现的,新生代又分类了Eden和survivor(幸存区 幸存0区 幸存1区)两个区,数据会先分配到Eden区(伊甸园区)中去,如果Eden没有足够的空间,那么JVM就触发一次Minor GC(垃圾回收)操作,如果对象经过一次minor gc操作还存活在Eden中,并且可以被Survivor空间接收,那么就将这个对象移到Survivor中去,将年龄设置为1,在Survivor中的对象每经过一次垃圾回收还存活的话,就年龄加1(每经历一次垃圾回收就年龄+1),当对象年龄加到15的时候,就把这个对象放入老年区中去。晋升到老年区的时候次对象的年龄是可以自己设置的,如果说老年带满了会进行一次 Full GC操作,因为Full GC不常用,所以采用Mark-compact算法去清理老年代中的对象。

为什么元空间替换了永久代(元空间的好处)

区别:

  1. 元空间不在虚拟机中,而是使用本地内存

  2. 默认情况下,元空间大小仅受本地内存限制。

  3. 永久代会造成一个内存溢出的问题,永久代的调优很困难

  4. 永久代中存放的是:字符串常量,类的元数据。

  5. 元空间中存放的是类的元数据,将字符串常量存放在了堆中。