Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java G1GC旧世代承诺堆不断增长,使用不变-导致伊甸园饥饿_Java_Spring Mvc_Garbage Collection_Openshift Origin_G1gc - Fatal编程技术网

Java G1GC旧世代承诺堆不断增长,使用不变-导致伊甸园饥饿

Java G1GC旧世代承诺堆不断增长,使用不变-导致伊甸园饥饿,java,spring-mvc,garbage-collection,openshift-origin,g1gc,Java,Spring Mvc,Garbage Collection,Openshift Origin,G1gc,G1GC旧一代提交的堆会随着时间的推移而增加(生产时大约5到6天),但旧一代使用的堆不会。Eden和幸存者堆被迫减少到最小值(占总堆的5%),因此垃圾收集变得越来越频繁。应用程序在开始时缓存一个大对象图,然后在其整个运行生命周期内进行其他时间/使用限制缓存。它有一个相当高的对象创建率,但除了缓存对象之外,它不会将大部分创建率提升到旧一代 我已经通过gceasy.io运行了GC日志,您可以看到内存的上述行为: . gclog: 此运行的Grafana内存度量 运行结束时的堆转储(负载已被删除约

G1GC旧一代提交的堆会随着时间的推移而增加(生产时大约5到6天),但旧一代使用的堆不会。Eden和幸存者堆被迫减少到最小值(占总堆的5%),因此垃圾收集变得越来越频繁。应用程序在开始时缓存一个大对象图,然后在其整个运行生命周期内进行其他时间/使用限制缓存。它有一个相当高的对象创建率,但除了缓存对象之外,它不会将大部分创建率提升到旧一代

我已经通过gceasy.io运行了GC日志,您可以看到内存的上述行为: .

gclog:

此运行的Grafana内存度量

运行结束时的堆转储(负载已被删除约一个小时,这是一个500M gz文件):

我们似乎没有高质量的物体创造。服务器有12G内存,堆有6G内存

jvm:

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)
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
我们使用CentOS在openshift上运行:CentOS Linux 7.7.1908版(核心版)


内核:3.10.0-1062.12.1.el7.x86_64

一般来说,
提交的
内存值高于
使用的
是正常的。Committed以
-Xms
开始,可以上升到
-Xmx
,但是
Committed
不是
常驻的
Resident
这里的意思是在RAM中,而
used=Resident+交换的页面
。所以
used
可能波动很大,而
committed
没有那么大,至少我是这样理解的

GC以
-Xms
的值作为初始提交内存开始,并将缓慢增长(当然会增长到
-Xmx
)。现在我已经做了这个介绍,我真的不认为这对你的应用程序有任何意义。让我解释一下

从您提供的日志中我可以看到,一切都是正常的
G1
的默认值为
MaxGCPauseMillis=200ms
,表示允许停止应用程序的时间(在快乐路径场景中)。根据这个值,
G1
做出适当的决定来重新调整区域的大小。根据您的日志,大约
270MB的
Eden
空间(平均)被收集到的
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]

这正是你间接要求的。对我来说,您的应用程序非常好,那些
GC暂停(G1疏散暂停)
占用的资源与您配置的一样多。顺便说一句,你觉得自己很幸运吗?但是在整个日志文件中没有一个我可以发现的
Full GC

您是否尝试过进行堆转储并在运行早期进行分析,然后在几天后进行比较?我尝试过,但没有发现任何特别之处,特别是,实际使用的堆总是比提交的堆低很多。在本次运行结束时,我有一个堆转储,它显示了1.3G的总堆使用量,而旧一代的堆使用量接近6G(我将上传一个链接)。因此,伊甸园是饥饿的。我上传了一个grafana metrics链接,以显示与gceasy显示的类似的内存使用情况。@TomDearman我遇到了相同的问题(Committed~2*已使用),您找到根本原因了吗?当我有一个小的eden+survivor提交空间时,gc将使用很大一部分cpu使用量,即使我有足够的内存,整个应用程序也会变慢