Java 11 新垃圾回收器 ZGC
可伸缩、低延迟的垃圾回收器
GC 暂停时间不超过 10ms
堆管理容量范围(小M级别,大到T级别)
对应用吞吐量影响不超过15%(对比 G1)
为进一步的添加新特性和优化做基础
默认支持 Linux/x64 系统
一、 启用Linux Large Pages
ZGC 启用Large Pages 是一种对应用高性能的折中(吞吐量、低延迟及启动时间),但是却不会带来明显的弊端。除了在应用启动上需要稍微复杂的配置,所需要的系统相关root权限需要手动进行配置。
Linux Large 在x86 linux平台也称为 huge pages,页大小为2M。
假设需要16G大小的JAVA 堆,则意味着需要 16G / 2M = 8192 huge pages。
首先需要分配至少16G(8192 huge pages)内存到 huge pages 内存池。 之所以说至少,是因为如果 JVM 启用了的 huge pages,那么不仅仅是GC,同时也包括JVM 的其它功能部分也会用到这部分内存(code heap, marking bitmaps 等),因此在此我们分配 9216 pages (18G),保持有2G的额外内存供非堆分配使用。
1. 配置系统的 huge pages 内存池:
$ echo 9216
> /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
附注:系统在没有足够内存的情境下会导致这一命令执行失败;命令执行完成需要一定的时间,可以通过以下命令进行查看:
$ cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
9216
2. 挂载 hugetlbfs 文件系统,并分配JVM运行用户权限:
$ mkdir /hugepages
$ mount -t hugetlbfs -o uid=123
nodev /hugepages
附注:对于内核大于等于4.4的linux系统,可以跳过此步骤。
3. JVM启动命令添加 -XX:+UseLargePages 配置:
$ java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms16G -Xmx16G -XX:+UseLargePages ...
4. 如果挂载了多个 hugetlbfs 文件系统,则需要通过 -XX:ZPath 命令指定需要使用的 hugetlbfs 系统:
$ java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms16G -Xmx16G -XX:+UseLargePages -XX:ZPath=/hugepages ...
附注:huge pages 内存池分配及 hugetlbfs 文件系统挂载是非持久化的,会因系统重启而丢失,因此需要用户一定的措施来处理此种情景。
二、启用 Transparent Huge Pages
... ...
三、启用 NUMA
ZGC默认支持 NUMA,会优先在NUMA-local 内存进行 JAVA 堆内存分配,但是在有CPU亲和性设置的情况下,JVM会自动禁用NUMA,如果需要显示的设置NUMA支持,可以通过配置以下选项:-XX:+UseNUMA
or -XX:-UseNUMA。
对于运行在 NUMA 机器的 JVM ,启用NUMA,能够在性能上的到显著的提升。
四、启用 GC 日志
启用命令:
-Xlog:<tag set>,[<tag set>, ...]:<log file>
帮助信息:
-Xlog:help
基本日志:
-Xlog:gc:gc.log
性能调试:
-Xlog:gc*:gc.log
gc* 代表所有有gc标志的日志。:gc.logd代表日志写入gc.log文件。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释