我的堆内存有问题。每天的内存增加了100MB,并且继续增加,FULL GC在1.5GB的限制之后运行,但是仍然没有恢复。
检查日志后,是否看到CMS:中止预清理?因为这可能是因素。
任何帮助表示赞赏。
CMS:由于时间终止预清洁???任何想法如何解决这个问题?
环境:Java 1.6
Here are my GC params:
-Dfile.encoding=UTF-8 \
-Duser.timezone=US/Eastern \
-Dsun.net.inetaddr.ttl=60 \
-Dsun.net.inetaddr.negative.ttl=60 \
-Xms1024m \
-Xmx1536m \
-Xss512k \
-verbose:gc \
-Xloggc:$CATALINA_BASE/logs/gc_log \
-XX:+DisableExplicitGC \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:+PrintGCDetails \
-XX:+PrintGCTimeStamps \
-XX:+UseConcMarkSweepGC \
-XX:+UseParNewGC \
-XX:CMSInitiatingOccupancyFraction=50 \
-XX:GCTimeRatio=99 \
-XX:MaxNewSize=512m \
-XX:MaxTenuringThreshold=30 \
-XX:NewSize=512m \
-XX:SurvivorRatio=6 \
-XX:TargetSurvivorRatio=90 \
**495747.455: [CMS-concurrent-mark-start]
495749.159: [CMS-concurrent-mark: 1.705/1.705 secs] [Times: user=1.91 sys=0.05, real=1.71 secs]
495749.159: [CMS-concurrent-preclean-start]
495749.166: [CMS-concurrent-preclean: 0.006/0.007 secs] [Times: user=0.01 sys=0.00, real=0.00 secs]
495749.166: [CMS-concurrent-abortable-preclean-start]
495752.728: [GC 495752.728: [ParNew: 432226K->29458K(458752K), 0.0462900 secs] 1419590K->1016821K(1507328K), 0.0464200 secs] [Times: user=0.08 sys=0.00, real=0.04 secs]
CMS: abort preclean due to time 495754.230: [CMS-concurrent-abortable-preclean: 2.067/5.063 secs] [Times: user=2.43 sys=0.11, real=5.06 secs]
495754.230: [GC[YG occupancy: 146431 K (458752 K)]495754.230: [Rescan (parallel) , 0.0446310 secs]495754.275: [weak refs processing, 0.0000080 secs] [1 CMS-remark: 987363K(1048576K)] 1133794K(1507328K), 0.0447400 secs] [Times: user=0.07 sys=0.00, real=0.05 secs]**
最佳答案
可终止的预清洗是可终止的。这可能是一个问题,但我怀疑您的担心最少。
如果在完全GC之后没有清理内存,是因为该内存保留在某处。我将进行堆转储,以了解为什么保留此内存。即您拥有一些资源。
当您调查时,我会尝试增加可用的内存。例如新大小为2 GB,租用空间为2 GB。较大的年轻一代将减少进入使用权空间并在以后需要清理的对象的数量。
我不会尝试调整太多的参数,因为JVM可以相当有效地配置自身。