java - 为什么会发生 Full GC Continuous?

标签 java garbage-collection jvm

GC日志

2017-11-08T01:48:24.133+0800: 63444.343: [Full GC [PSYoungGen: 918116K->0K(1494016K)] [ParOldGen: 2271465K->1273508K(2555904K)] 3189581K->1273508K(4049920K) [PSPermGen: 101780K->101780K(131072K)], 0.8804710 secs] [Times: user=8.48 sys=0.03, real=0.89 secs] 
2017-11-08T01:48:32.132+0800: 63452.342: [Full GC [PSYoungGen: 855154K->0K(1494016K)] [ParOldGen: 2287221K->1322801K(2555904K)] 3142375K->1322801K(4049920K) [PSPermGen: 101780K->101780K(131072K)], 0.8771230 secs] [Times: user=8.40 sys=0.00, real=0.88 secs] 
2017-11-08T01:48:40.132+0800: 63460.342: [Full GC [PSYoungGen: 902479K->0K(1494016K)] [ParOldGen: 2336514K->1256452K(2555904K)] 3238994K->1256452K(4049920K) [PSPermGen: 101780K->101780K(131072K)], 0.8855200 secs] [Times: user=8.84 sys=0.01, real=0.89 secs] 
2017-11-08T01:48:48.130+0800: 63468.340: [Full GC [PSYoungGen: 882590K->0K(1494016K)] [ParOldGen: 2270165K->1256453K(2555904K)] 3152755K->1256453K(4049920K) [PSPermGen: 101780K->101780K(131072K)], 0.8677890 secs] [Times: user=8.42 sys=0.01, real=0.87 secs] 
2017-11-08T01:48:56.133+0800: 63476.343: [Full GC [PSYoungGen: 861301K->0K(1494016K)] [ParOldGen: 2270166K->1322782K(2555904K)] 3131468K->1322782K(4049920K) [PSPermGen: 101780K->101780K(131072K)], 0.8013890 secs] [Times: user=7.17 sys=0.00, real=0.81 secs] 
2017-11-08T01:49:04.127+0800: 63484.337: [Full GC [PSYoungGen: 898990K->0K(1494016K)] [ParOldGen: 2336494K->1256170K(2555904K)] 3235485K->1256170K(4049920K) [PSPermGen: 101780K->101780K(131072K)], 0.8792570 secs] [Times: user=8.35 sys=0.00, real=0.88 secs] 
2017-11-08T01:49:12.132+0800: 63492.342: [Full GC [PSYoungGen: 885368K->0K(1494016K)] [ParOldGen: 2269882K->1256088K(2555904K)] 3155251K->1256088K(4049920K) [PSPermGen: 101780K->101780K(131072K)], 0.8924250 secs] [Times: user=8.41 sys=0.03, real=0.89 secs] 
2017-11-08T01:49:20.125+0800: 63500.335: [Full GC [PSYoungGen: 858394K->0K(1494016K)] [ParOldGen: 2269801K->1322779K(2555904K)] 3128195K->1322779K(4049920K) [PSPermGen: 101780K->101780K(131072K)], 0.8686500 secs] [Times: user=8.32 sys=0.00, real=0.87 secs] 
2017-11-08T01:49:28.128+0800: 63508.338: [Full GC [PSYoungGen: 902214K->0K(1494016K)] [ParOldGen: 2336492K->1256045K(2555904K)] 3238707K->1256045K(4049920K) [PSPermGen: 101780K->101780K(131072K)], 0.8648800 secs] [Times: user=8.45 sys=0.01, real=0.87 secs] 
2017-11-08T01:49:36.128+0800: 63516.338: [Full GC [PSYoungGen: 883133K->0K(1494016K)] [ParOldGen: 2269758K->1256037K(2555904K)] 3152892K->1256037K(4049920K) [PSPermGen: 101780K->101780K(131072K)], 0.8212970 secs] [Times: user=7.20 sys=0.15, real=0.83 secs] 
2017-11-08T01:49:44.128+0800: 63524.338: [Full GC [PSYoungGen: 875607K->0K(1494016K)] [ParOldGen: 2269750K->1322438K(2555904K)] 3145357K->1322438K(4049920K) [PSPermGen: 101780K->101780K(131072K)], 0.8001900 secs] [Times: user=7.11 sys=0.00, real=0.80 secs]

JVM 选项

-Xms4096m 
-Xmx4096m 
-Xmn1600m 
-XX:PermSize=128M 
-XX:MaxPermSize=256M 
-XX:+PrintGCDetails 
-verbose:gc 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps 
-XX:+PrintGCDateStamps 
-XX:-HeapDumpOnOutOfMemoryError

即使 ParOldGen 加 ParOldGen 低于 Xmx4096m,也会发生频繁的 Full GC。 谁能帮我分析一下吗?如何优化这种情况?

最佳答案

查看你的GC日志,你在旧空间中直接分配了。一旦旧空间耗尽,就会触发完整GC(即使年轻空间有一些空闲空间)。 在旧空间中直接分配可能是由于对象大小超过剩余 Eden 大小(对于您的堆几何结构而言大约 300 MiB)造成的。

已提供,

  • 您正在分配巨大的对象
  • 这些对象的生命周期很短(每次 GC 恢复约 2 GiB)

我无法建议您任何 GC 调整策略(除非您准备好大幅增加堆大小)。

我建议您调查正在分配的巨大对象的性质。堆转储或任务控制(请参阅“TLAB 外部分配”)应该会有所帮助。

关于java - 为什么会发生 Full GC Continuous?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47170856/

相关文章:

java - 如何衡量多线程应用程序中的代码性能?

java - 不可变对象(immutable对象)如何帮助减少垃圾收集带来的开销?

C#:在什么情况下应该清空引用?

java - JVM 中不断增长的常驻大小集

java - 运行 Maven 时为 "Invalid maximum heap size"

linux - 如何在 Linux/WebSphere 上为 JProfiler(离线/远程模式)设置 TMP 目录

java - 将时间单位添加到 Joda DateTime 对象

Java 泛型 : assignment with nested wildcard parameters

C#:收集 WeakReference 之前的通知?

java - EJB3 与 Spring