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机器,未做测试。

Java11新特性 - Epsilon GC和ZGC的更多相关文章

  1. 【Java基础】Java11 新特性

    Java11 新特性 新增字符串处理方法 新增方法: 判断字符串是否为空白 " ".isBlank(); // true 去除首尾空白 " Javastack " ...

  2. 17Java进阶——反射、进程、Java11新特性

    1.Java反射机制 Java反射(Reflection)概念:在运行时动态获取类的信息以及动态调用对象方法的功能. 1.1反射的应用--通过全类名获取类对象及其方法 package two.refl ...

  3. Java11新特性解读

    在去年的9月26日,Oracle官方宣布Java11正式发布,这是Java大版本周期变化后的第一个长期支持版本,非常值得关注.Java9和Java10都在很短的时间内就过渡了,所以,Java11将是一 ...

  4. Java11新特性!

    Java11又出新版本了,我还在Java8上停着.不过这也挡不住我对他的热爱,忍不住查看了一下他的新性能,由于自己知识有限,只总结了以下八个特性: 1.本地变量类型推断 什么是局部变量类型推断? va ...

  5. Java11新特性 - 新加一些实用的API

    1. 新的本机不可修改集合API 自从Java9开始,JDK里面为集合(List/Set/Map)都添加了of和copyOf方法,他们可以来创建不可变的集合. Question1:什么叫做不可变集合? ...

  6. Java11新特性

    局部变量类型推断增强 Java11中可以在lambda表达式的形参中使用var,好处是可以在形参上加注解 使用示例 (@Deprecated var x, @Nullable var y)->x ...

  7. Java12新特性 -- Shenandoah GC

    Shenandoah 垃圾回收器是 Red Hat 在 2014 年宣布进行的一项垃圾收集器研究项目 Pauseless GC 的实现,旨在针对 JVM 上的内存收回实现低停顿的需求.该设计将与应用程 ...

  8. Java11新特性 - 标准Java异步HTTP客户端

    Java9开始引入的一个处理 HTTP 请求的的 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在 java.net 包中找到这个 AP ...

  9. java基础---java8后新特性

    1. java9 新特性 模块化的使用 减少内存的开销. 可简化各种类库和大型应用的开发和维护. 安全性,可维护性,提高性能. 在 module-info.java 文件中,我们可以用新的关键词mod ...

随机推荐

  1. jenkins自动化部署项目4 -- 安装和配置jdk、maven、git

    Jenkins提供了自动安装jdk,maven,git的功能,在[系统设置-全局工具配置]里,但是我自动安装没反应,因此我是先手工安装和配置它们的环境变量然后再在[系统设置-全局工具配置]里配置: 1 ...

  2. JS中如何防止表单重复提交问题

    在登录页面html中写如下代码 <script type="text/javascript"> var issubmit=false; function dosubmi ...

  3. RDD转换为DataFrame【反射/编程】

    写在前面 主要是加载文件为RDD,再把RDD转换为DataFrame,进而使用DataFrame的API或Sql进行数据的方便操作 简单理解:DataFrame=RDD+Schema 贴代码 pack ...

  4. Java 基础篇之异常

    异常 异常层次 Error:Java 运行时系统的内部错误和资源耗尽错误.应用程序不应该抛出这种类型的对象.如果出现了这样的内部错误,除了通告给用户,并尽力使程序安全地终止之外,再也无能为力了. Ex ...

  5. 每个人都要学的图片压缩终极奥义,有效解决 Android 程序 OOM

    # 由来 在我们编写 Android 程序的时候,几乎永远逃避不了图片压缩的难题.除了应用图标之外,我们所要显示的图片基本上只有两个来源: 来自网络下载 本地相册中加载 不管是网上下载下来的也好,还是 ...

  6. 阿里云服务器CentOS6.9 tomcat配置https安全访问

    应用场景 上线微信小程序的时候,域名要求https安全格式,否则获取数据异常. 第一步.SSL证书获取 获取SSL证书方式很多种,包括网页生成.工具生成等,这里我使用阿里云平台获取免费ssl证书的方法 ...

  7. C# 服务里面调用Python.exe 来执行python文件

    问题描述:在WCF服务里面通过调用python.exe来执行py文件,像下面这样py文件路径+参数,用空格隔开.会出现调用结果为空的现象 System.Diagnostics.ProcessStart ...

  8. 软件开发工具(第9章:使用Eclipse进行C/C++开发)

    一.安装MinGW MinGW是指用来生成可执行文件的编译环境,它是开发C/C++项目 的工具集.为了能够使用Eclipse CDT编译且运行C和C++程序,必须 要安装一个C/C++编译器. 下载: ...

  9. 求n以内的质数(质数的定义:在大于1的自然数中,除了1和它本身意外,无法被其他自然数整除的数)

    思路: 1.(质数筛选定理)n不能够被不大于根号n的任何质数整除,则n是一个质数2.除了2的偶数都不是质数代码如下: /** * 求n内的质数 * @param int $n * @return ar ...

  10. mobaxterm使用手册

    Mobaxterm V14使用手册 文章出处    https://blog.51cto.com/937761/2372598 简介 MobaXterm 一款Windows系统下全功能终端软件.以下将 ...