微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的JVM在启动时做了3次FullGC

如何解决为什么我的JVM在启动时做了3次FullGC

我的工作是Flink TaskManager工作。启动时,它将启动3次GC。我不知道为什么当到达MetadataGCThreshold时,它增加了终身空间,而Metaspace却没有变化,甚至在GC之间也增加了。

我认为FullGC将减少Tenured Space和Metaspace的某些空间。 ?

Java HotSpot(TM) 64-Bit Server VM (25.211-b12) for linux-amd64 JRE (1.8.0_211-b12),built on Apr  1 2019 20:39:34 by "java_re" with gcc 7.3.0
Memory: 4k page,physical 4194304k(3951532k free),swap 0k(0k free)
CommandLine flags: -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/flink-jvm -XX:InitialHeapSize=2899312640 -XX:MaxDirectMemorySize=9223370937343148032 -XX:MaxHeap
Size=2899312640 -XX:NewSize=2147483648 -XX:+PrintFlagsFinal -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClasspointers -XX:+UseCompressedOops 

# first GC,the Tenured space even increase?!
2.452: [Full GC (Metadata GC Threshold) 2.452: [Tenured: 0K->14532K(735232K),0.0623627 secs] 167782K->14532K(2622720K),[Metaspace: 20876K->20876K(1067008K)],0.0624443 secs] [Times: user=0.05 
sys=0.01,real=0.07 secs] 

11.656: [Full GC (System.gc()) 11.656: [Tenured: 14532K->27057K(735232K),0.1974158 secs] 395065K->27057K(2622720K),[Metaspace: 32454K->32454K(1077248K)],0.1975190 secs] [Times: user=0.18 sys=
0.02,real=0.20 secs] 

65.942: [Full GC (Metadata GC Threshold) 65.942: [Tenured: 27057K->55025K(735232K),0.2259224 secs] 512544K->55025K(2622720K),[Metaspace: 53760K->53760K(1097728K)],0.2262134 secs] [Times: user
=0.18 sys=0.03,real=0.23 secs] 

================================================ ================== 跟进 感谢斯蒂芬的回答,我通过-XX:MetaspaceSize=134217728设置了MetaSpace的initialSize。我两次开始工作,第二次使用这个jvm参数。由于Metadata GC Threshold而没有FullGC。

######  之前: first time
bash-4.2$ tailf gc_log_2020-08-26_07-19-05_pid84.log 
Java HotSpot(TM) 64-Bit Server VM (25.241-b26) for linux-amd64 JRE (1.8.0_241-b26),built on Jan  6 2020 08:59:51 by "java_re" with gcc 7.3.0
Memory: 4k page,physical 4194304k(3920180k free),swap 0k(0k free)
CommandLine flags: -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/flink-jvm -XX:InitialHeapSize=2899312640 -XX:MaxDirectMemorySize=9223370937343148032 -XX:MaxHeapSize=2899312640 -XX:NewSize=2147483648 -XX:+PrintFlagsFinal -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClasspointers -XX:+UseCompressedOops 
2.359: [Full GC (Metadata GC Threshold) 2.359: [Tenured: 0K->14643K(735232K),0.0526437 secs] 167782K->14643K(2622720K),[Metaspace: 20937K->20937K(1067008K)],0.0527307 secs] [Times: user=0.04 sys=0.01,real=0.05 secs] 
14.576: [Full GC (System.gc()) 14.576: [Tenured: 14643K->27136K(735232K),0.1894478 secs] 417611K->27136K(2622720K),[Metaspace: 32274K->32274K(1077248K)],0.1895372 secs] [Times: user=0.15 sys=0.02,real=0.19 secs] 

######  添加Metadata参数之后(-XX:MetaspaceSize=134217728),second time with param
bash-4.2$ tailf gc_log_2020-08-26_07-23-19_pid85.log 
Java HotSpot(TM) 64-Bit Server VM (25.241-b26) for linux-amd64 JRE (1.8.0_241-b26),physical 4194304k(3920136k free),swap 0k(0k free)
CommandLine flags: -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/flink-jvm -XX:InitialHeapSize=2899312640 -XX:MaxDirectMemorySize=9223370937343148032 -XX:MaxHeapSize=2899312640 -XX:MetaspaceSize=134217728 -XX:NewSize=2147483648 -XX:+PrintFlagsFinal -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClasspointers -XX:+UseCompressedOops 
5.196: [Full GC (System.gc()) 5.196: [Tenured: 0K->27063K(735232K),0.2379232 secs] 973363K->27063K(2622720K),[Metaspace: 32544K->32544K(1077248K)],0.2380344 secs] [Times: user=0.25 sys=0.03,real=0.24 secs] 

解决方法

为什么我的JVM在启动时做了3次FullGC?

第一个和第三个Full GC是由元空间达到当前阈值并需要增长而触发的。由于元空间主要用于保存与代码相关的事物,因此这意味着Flink正在加载大量代码或生成大量动态代理或类似的东西。

您可以考虑增加初始元空间的大小。

第二个完整GC由显式System.gc()调用触发。我的猜测是Flink正在这样做。

我认为FullGC会减少保有权空间。

不一定。如果Full GC是由元空间填充触发的,那么您很可能会发现新空间中的许多对象都是长期使用的。在第一种情况下,很明显已经发生了这种情况,因为在GC之前,保有权空间是

...而元空间没有变化,甚至在GC之间也有所增加

这意味着GC在元空间中找不到任何垃圾。我只希望如果ClassLoader实例(及其所有类,以及它们的所有实例)无法访问,则使用的元空间会减少。预计启动期间元空间的使用将增加。仅在应用程序启动后 且JVM已完全预热后,它是否继续增加才可能引起关注。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?