我有一个java的web服务,包含在jetty中。我使用sun的java 6和默认的parallelgc,并且打开了以下命令行选项:“-verbose:gc-xx:+printgctamps--xx:+printgcdetails”。
当我的进程内存不足时,我会看到这样的连续日志:
66872.846:[满GC[PSYOUNGGEN:932534K->930686K(1865088K)][PSOLDGEN:5595037K->5595024K(5595136K)]6527571K->6525710K(7460224K)[PSPERMGEN:16488K->16487K(21504K)],12.2488150秒][次数:用户=12.25 sys=0.00,实数=12.24秒]
66885.098:[满GC[PSYoungGen:932608K->932608K(1865088K)][psoldGen:5595024K->5595024K(5595136K)]6527632K->6527632K(7460224K)[pspermgen:16487K->16487K(21504K)],9.6745600秒][次数:用户=9.66 sys=0.01,实数=9.67秒]
66894.773:[满GC[PSYoungGen:932608K->932488K(1865088K)][psoldGen:5595024K->5595023K(5595136K)]6527632K->6527512K(7460224K)[pspermgen:16487K->16487K(21504K)],11.8445420秒][次数:用户=11.85 sys=0.00,实数=11.85秒]
66906.623:[满GC[PSYOUNGGEN:932608K->932608K(1865088K)][psoldGEN:5595023K->5595023K(5595136K)]6527631K->6527631K(7460224K)[pspermgen:16487K->16487K(21504K)],9.6006950秒][次数:用户=9.60系统=0.00,实数=9.60秒]
66916.224:[满GC[PSYOUNGGEN:932608K->932488K(1865088K)][PSOLDGEN:5595023K->5595023K(5595136K)]6527631K->6527512K(7460224K)[PSPERMGEN:16487K->16487K(21504K)],9.6498320秒][次数:用户=9.65 sys=0.00,实数=9.65秒]
66925.881:[全GC[PSYOUNGGEN:932608K->0K(1865088K)][PSOLDGEN:5595023K->4133351K(5595136K)]6527631K->4133351K(7460224K)[PSPERMGEN:16487K->16487K(21504K)],6.8990990秒][次数:用户=6.90系统=0.00,实际=6.90秒]
前五行显示垃圾收集器完全没有取得任何进展。根据我对jvm的理解,这会导致outofmemoryerror,但在日志中没有看到类似的情况。有没有可能(在jvm级别)有什么东西阻止它们被抛出?或者Jetty或者我的应用程序正在抑制它们?
谢谢你的建议!
最佳答案
尝试显式设置该选项,或者改为设置-xx:gcheapfreelimit。这些选项的文档非常少,可能不能完全反映您正在运行的jvm的行为。(或者相关选项的默认值已更改。)