Java11新特征 - Epsilon GC和ZGC
2019-11-18杂谈搜奇网35°c
A+ A-Java11中新增了两个GC,Epsilon GC和ZGC。
Epsilon垃圾收集器
A NoOp Garbage Collector
没有操纵的垃圾收集器
JDK上对这个特征的形貌是:开辟一个处置惩罚内存分派但不完成任何现实内存接纳机制的GC, 一旦可用堆内存用完,JVM就会退出。
假如有System.gc()挪用,现实上什么也不会发作(这类场景下和-XX:+DisableExplicitGC效果一样), 由于没有内存接纳,这个完成可能会正告用户尝试强迫GC是白费。
用法
-XX:+UnlockExperimentalVMOptions
-XX:+UseEpsilonGC
测试默许GC
我们写一段代码,不停的发生垃圾:
public class EpsilonTest {
public static void main(String[] args) {
boolean flag = true;
List<Garbage> garbageList = new ArrayList<>();
int count = 0;
while (flag) {
garbageList.add(new Garbage());
if (count ++ == 500) {
garbageList.clear();
}
}
}
}
class Garbage {
private double d1 = 1;
private double d2 = 2;
/**
* 在GC消灭对象时会挪用一次
*/
@Override
protected void finalize() throws Throwable {
System.out.println(this + " collecting");
}
}
直接运转,运用的默许的垃圾接纳器:
java11.Garbage@37c7d031 collecting
java11.Garbage@71a19bf9 collecting
java11.Garbage@3b2df791 collecting
java11.Garbage@61441b29 collecting
java11.Garbage@680b1968 collecting
java11.Garbage@158829c3 collecting
java11.Garbage@414dc59c collecting
java11.Garbage@1103cf collecting
......
从运转打印的效果能够看出:有对象被接纳了,触发了GC【默许用的是G1】
由于我只限定接纳了500个,500个以后的对象会不停加到内存中,内存就会不够用:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java11.EpsilonTest.main(EpsilonTest.java:16)
测试Epsilon GC
假如我运用的是Epsilon GC,会是什么样的效果呢?
运用方法
启动时增加VM参数:
运转效果
运转代码,发明控制台没有任何的输出,即EpsilonGC不会做任何的接纳,而且顺序很快就由于堆空间不足而退出。
Terminating due to java.lang.OutOfMemoryError: Java heap space
运用这个选项的缘由
供应完整被动的GC完成, 具有有限的分派限定和尽量低的耽误开支,但价值是内存占用和内存吞吐量.
尽人皆知, java完成可广泛挑选高度可设置的GC完成. 种种可用的收集器终究满足差别的需求, 纵然它们的可设置性使它们的功用订交. 偶然更轻易保护零丁的完成, 而不是在现有GC完成上聚集另一个设置选项.
主要用途
- 机能测试(它能够协助过滤掉GC引发的机能假象)
- 内存压力测试(比方,晓得测试用例 应当分派不凌驾1GB的内存, 我们能够运用-Xmx1g –XX:+UseEpsilonGC, 假如顺序有题目, 则顺序会崩溃)
- 异常短的JOB使命(对象这类使命, 接收GC清算堆那都是糟蹋空间)
- VM接口测试
- Last-drop 耽误&吞吐革新
ZGC
ZGC, A Scalable Low-Latency Garbage Collector(Experimental)
ZGC是一款可伸缩、低耽误的GC
概述
ZGC,应当是JDK11最为注视的特征。然则背面带了Experimental,申明这还不发起用到生产环境。
- GC停息时刻不会凌驾10ms
- 既能处置惩罚几百兆的小堆, 也能处置惩罚几个T的大堆(OMG)
- 和G1比拟, 运用吞吐能力不会下落凌驾15%
- 为未来的GC功用和应用colord指针以及Load barriers优化奠基基本
- 初始只支撑64位体系
ZGC的设想目的是:支撑TB级内存容量,停息时刻低(<10ms),对全部顺序吞吐量的影响小于15%。 未来还能够扩大完成机制,以支撑不少令人兴奋的功用,比方多层堆(即热对象置于DRAM和冷对象置于NVMe闪存),或紧缩堆。
在运用G1的时刻,在接纳垃圾的时刻,必需要保证运用顺序当中一切的线程停下来,不在内存中制作杂沓,然后GC才会最先事情,会形成停留。这一个历程,有一个专属名词来诠释:STW(stop the world)。
ZGC的目的就是收缩STW的时刻:ZGC是一个并发,基于region, 紧缩型的垃圾收集器,只要root扫描阶段会STW, 因而GC停留时刻不会跟着堆的增进和存活对象的增进而变长。
用法
-XX:+UnlockExperimentalVMOptions
-XX:+UseZGC
ps:ZGC暂时不能在windows体系中运用,不晓得最新的版本有无支撑,我手边没有windows机械,未做测试。