【发布时间】:2015-04-24 23:39:36
【问题描述】:
我们的服务器应用程序似乎在一段时间内正常运行,但一段时间后,幸存者空间填充到 100%,从那时起堆使用量增加,GC 周期(次要和主要)变得越来越频繁最终堆耗尽。
这是 'jstat -gcutil 1000' 输出的一部分:
S0 S1 E O P YGC YGCT FGC FGCT GCT
100.00 0.00 99.17 48.34 59.93 7014 11777.197 345 554.945 12332.143
100.00 0.00 99.17 48.34 59.93 7014 11777.197 345 554.945 12332.143
100.00 0.00 99.17 48.34 59.93 7014 11777.197 345 554.945 12332.143
100.00 0.00 99.17 48.34 59.93 7014 11777.197 345 554.945 12332.143
100.00 6.02 100.00 48.55 59.93 7015 11777.197 345 554.945 12332.143
0.00 100.00 1.30 50.43 59.93 7015 11778.699 345 554.945 12333.644
0.00 100.00 10.74 50.43 59.93 7015 11778.699 345 554.945 12333.644
0.00 100.00 19.16 50.43 59.93 7015 11778.699 345 554.945 12333.644
0.00 100.00 27.72 50.43 59.93 7015 11778.699 345 554.945 12333.644
0.00 100.00 37.43 50.43 59.93 7015 11778.699 345 554.945 12333.644
0.00 100.00 45.76 50.43 59.93 7015 11778.699 345 554.945 12333.644
0.00 100.00 55.35 50.43 59.93 7015 11778.699 345 554.945 12333.644
0.00 100.00 63.05 50.43 59.93 7015 11778.699 345 554.945 12333.644
0.00 100.00 72.27 50.43 59.93 7015 11778.699 345 554.945 12333.644
0.00 100.00 81.21 50.43 59.93 7015 11778.699 345 554.945 12333.644
0.00 100.00 90.46 50.43 59.93 7015 11778.699 345 554.945 12333.644
0.00 100.00 100.00 50.43 59.93 7016 11778.699 345 554.945 12333.644
80.16 100.00 100.00 50.53 59.93 7016 11778.699 345 554.945 12333.644
100.00 0.00 5.96 51.79 59.93 7016 11780.080 345 554.945 12335.026
100.00 0.00 7.73 51.79 59.93 7016 11780.080 345 554.945 12335.026
100.00 0.00 7.73 51.79 59.93 7016 11780.080 345 554.945 12335.026
100.00 0.00 7.73 51.79 59.93 7016 11780.080 345 554.945 12335.026
我的问题是这种应用程序行为背后的主要原因是什么?是年轻空间或堆太小,还是其他一些 JVM 参数,还是只是普通的旧内存泄漏?
解决此问题的最佳策略是什么,GC 调优或应用程序重构?
JDK 1.6、HP-UX、Xmx/Xms 1G、Xmn 264M、+UseConcMarkSweepGC、+UseParNewGC
非常感谢
【问题讨论】:
-
我们在短时间内创建了太多对象吗?
-
是的,但这就是应用程序正在做的事情。让我感到困惑的是,一开始(而应用程序的负载几乎是恒定的),分配率根本没有那么高。
-
是否总是在相同的时间后、一天中的同一时间或某些应用程序事件后开始发生?
-
它发生在应用处理了大致相同的交易量之后,这与时间的吻合度更低。
标签: java memory-leaks garbage-collection