本文已参加「新人创作礼」活动,一起开启掘金创作之路.
在学习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算法去清理老年代中的对象。
为什么元空间替换了永久代(元空间的好处)
区别:
-
元空间不在虚拟机中,而是使用本地内存
-
默认情况下,元空间大小仅受本地内存限制。
-
永久代会造成一个内存溢出的问题,永久代的调优很困难
-
永久代中存放的是:字符串常量,类的元数据。
-
元空间中存放的是类的元数据,将字符串常量存放在了堆中。