Tom*_*man 5 java garbage-collection spring-mvc g1gc openshift-origin
G1GC 年老代提交的堆随着时间的推移而增加(生产时大约 5 到 6 天),但年老代使用的堆没有。Eden 和survivor 堆被迫减少到最小值(总堆的5%),因此垃圾收集越来越频繁。应用程序在开始时缓存一个大对象图,然后在其整个运行生命周期中使用其他时间/使用受限的缓存。它具有相当高的对象创建率,但除了缓存对象外,并没有将其中的大部分提升到老年代。
我已经通过 gceasy.io 运行了 GC 日志,您可以看到内存的上述行为: https://gceasy.io/my-gc-report.jsp?p=c2hhcmVkLzIwMjAvMDUvMTEvLS1nY2xvZy50YXIuZ3otLTExLTMwLTE5&channel=WEB。
gclog:https ://drive.google.com/open ? id = 176X-Lku4D3DGCCdTiB0_z545N8n0tfKc
本次运行的 Grafana 内存指标https://snapshot.raintank.io/dashboard/snapshot/k6g3ljG7cQUEJM7jA4c5tBK1dsUnzabd
运行结束时的堆转储(负载已移除大约一个小时,这是一个 500M 的 gz 文件):https ://drive.google.com/open?id = 14ghzIVnpelInSyQBhCwUwM5VkuOjX13-
我们似乎没有高大的对象创建。服务器有 12G 的 RAM,堆有 6G。
虚拟机:
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.242-b08, mixed mode)
Run Code Online (Sandbox Code Playgroud)
jvm 标志:
-XX:CICompilerCount=4
-XX:ConcGCThreads=2
-XX:G1HeapRegionSize=2097152
-XX:GCLogFileSize=104857600
-XX:InitialHeapSize=6442450944
-XX:InitialRAMPercentage=50.000000
-XX:+ManagementServer
-XX:MarkStackSize=4194304
-XX:MaxHeapSize=6442450944
-XX:MaxNewSize=3865051136
-XX:MaxRAMPercentage=50.000000
-XX:MinHeapDeltaBytes=2097152
-XX:MinRAMPercentage=50.000000
-XX:NumberOfGCLogFiles=10
-XX:+PrintGC
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:+UseG1GC
-XX:+UseGCLogFileRotation
Run Code Online (Sandbox Code Playgroud)
我们使用 CentOS 在 openshift 上运行:CentOS Linux release 7.7.1908 (Core)
内核:3.10.0-1062.12.1.el7.x86_64
一般来说,committed内存值高于是正常的used。承诺始于并且-Xms可以达到-Xmx,但committed不是。 这里的意思是在RAM中,而. 所以可能会波动很大,虽然不会那么大,至少我是这么理解的。residentResidentused = resident + swapped pagesusedcommitted
GC 以 的值-Xms作为初始提交的内存开始,并且会慢慢增长(-Xmx当然,直到)。既然我已经做了这个介绍,我真的认为这对您的申请没有任何意义。让我解释。
据我从您提供的日志中看到,一切都在预期之中(并且正常)。G1有一个默认值,MaxGCPauseMillis = 200ms指示允许应用程序停止的程度(在快乐路径场景中)。根据这个值,G1做出正确的决定来调整您的区域大小。根据您的日志,Eden大约270MB(平均)的空间最多收集到0.2s。只是您日志中的一个随机示例:
[Eden: 280.0M ....
Times: user=0.49 sys=0.00, real=0.18 secs
2020-05-04T02:43:01.742+0000: 315128.451: [GC pause (G1 Evacuation Pause) (young), 0.1740299 secs]
Run Code Online (Sandbox Code Playgroud)
所以这正是你间接要求的。对我来说,您的应用程序非常好,这些应用程序GC pause (G1 Evacuation Pause)需要您配置的内容。顺便说一句,你说自己很幸运吗?但在整个日志文件中,Full GC我找不到任何一个日志文件(除了进行堆转储时的日志文件)。