java 垃圾收集器
# 最小堆值,不设置默认为操作系统 1/64
-Xms4G
# 最大堆值,不设置默认为操作系统 1/4
-Xmx4G
G1
jdk9开始默认启用,显示启用 -XX:+UseG1GC
介绍
- 服务器级计算机上的垃圾优先 (G1) 收集器,否则为串行收集器。
- GC 线程的最大数量受堆大小和可用 CPU 资源的限制
- 初始堆大小为物理内存的 1/64
- 最大堆大小为物理内存的 1/4
- 分层编译器,同时使用 C1 和 C2
常用配置方式(单选)
最大暂停时间期望
-XX:MaxGCPauseMillis=<nnn>
-XX:MaxGCPauseMillis=12
表示期望垃圾收集器的STW时间小于等于 12 毫秒。垃圾收集器动态调整 Java 堆大小和与垃圾收集相关的其他参数,以尝试使垃圾收集暂停时间短于 12 毫秒。最大暂停时间目标的默认值因收集器而异。这些调整可能会导致垃圾收集更频繁地发生,从而降低应用程序的整体吞吐量。但在某些情况下,无法达到所需的暂停时间目标。
吞吐量期望
# 垃圾收集时间与应用程序时间的比率为 1/(1+nnn)
-XX:MaxGCPauseMillis=<nnn>
-XX:GCTimeRatio=19
表示期望垃圾收集总时间为应用程序运行时间的 1/20 。
垃圾收集所花费的时间是所有垃圾收集引起的暂停的总时间。如果未达到吞吐量目标,则垃圾收集器可能采取的操作之一是增加堆的大小,以便在收集暂停之间应用程序所花费的时间可以更长。
ZGC
介绍
高资源占用,低延时。支持范围为几百兆到16T的内存。是一种可扩展的低延迟垃圾收集器。ZGC 同时执行所有昂贵的工作,而不会停止应用程序线程的执行超过一毫秒。适合需要低延迟的应用。暂停时间与正在使用的堆大小无关。ZGC 可以很好地处理从几百兆字节到 16TB 的堆大小。
ZGC 被设计为自适应且需要最少的手动配置。在 Java 程序执行期间,ZGC 通过调整代大小、扩展 GC 线程数量以及调整保有阈值来动态适应工作负载。主要的调整旋钮是增加最大堆大小。
使用命令
# 使用非分代ZGC(最早版本不支持分代)
-XX:+UseZGC
# 使用分代ZGC(官方推荐)
-XX:+UseZGC -XX:+ZGenerational
常用基础配置
设值最大堆(最重要)
# 指定最大堆为8g
-Xmx8g
# 指定最大堆为5g,通常4g就开始GC,实在不行才会跑的5g,再不行就OOM
-Xmx5g -XX:SoftMaxHeapSize=4gZGC
禁用未用内存释放
默认情况下,ZGC会将不需要用的内存释放给操作系统。该功能对于外部程序都有意义,但是会对内部线程延长产生负面影响。
# 禁用未用内存释放
-XX:-ZUncommit
# 由于最大堆和最小堆大小一致,也不会释放未用内存给操作系统
-Xmx8g -Xms8g
# 未用内存返给操作系统延迟。默认 300 秒
-XX:ZUncommitDelay=<seconds>
标签:java,收集器,XX,GC,垃圾,ZGC,Collector,内存
From: https://www.cnblogs.com/listjiang/p/18082731