2

我在我们的 prod 环境中看到一些异常行为,这导致我们在运行 Tomcat 的服务器上的线程数很高。10,092,544K 的堆大小在新生代和任期代之间划分为 2,752,512K + 7,340,032K = 10,092,544K。

我很困惑为什么当堆上有足够的内存可用时 GC 会多次运行(新旧一代)(Full GC [PSYoungGen: 0K->0K(2752512K)] [ParOldGen: 2748534K->2748529K(7340032K) )])

正如你所看到的,年轻一代的 0K->0K 和老一代的 .27G -> .27G 意味着几乎没有任何对象被 gc'd 并且有这么多的可用内存。(堆大小为 10G)。

由于 Full GC 在短时间内运行多次,这会导致性能下降,因此应用程序无法处理传入的用户请求,从而导致服务器上的高线程,最终我们必须重新启动服务器才能摆脱这种情况。

你能解释一下这里发生了什么吗?

这是 gc.log 上的输出。


. .

更多的...... 。.

7 月 18 日 14:52:38 fwprodcontent03 gc.log: 3172.122: [GC [PSYoungGen: 0K->0K(2752512K)] 2750855K->2750855K(10092544K), 0.0515920 secs] [Times: user=0.32 sys=0.01, real= 0.06 秒]

7 月 18 日 14:52:42 fwprodcontent03 gc.log: 3172.174: [Full GC [PSYoungGen: 0K->0K(2752512K)] [ParOldGen: 2750855K->2749937K(7340032K)] 2750855K->2749937K(1009937K(1009937K(1009937K(7340032K))] 2750855K->274993737K(1009937K(1009937K)(1009937K4) ->262115K(262144K)],4.1571260 秒] [时间:用户=44.29 系统=0.06,实际=4.15 秒]

7 月 18 日 14:52:42 fwprodcontent03 gc.log: 3176.361: [GC [PSYoungGen: 9071K->1280K(2752512K)] 2759008K->2751217K(10092544K), 0.0989600 secs] [Times: user=0.64 sys=0. 0.10秒]

7 月 18 日 14:52:46 fwprodcontent03 gc.log: 3176.461: [Full GC [PSYoungGen: 1280K->0K(2752512K)] [ParOldGen: 2749937K->2748847K(7340032K)] 2751217K->274484437KPS(1009) 274824437KPermKGen: 2 ->262121K(262144K)],3.1331910 秒] [时间:用户=31.25 系统=0.01,实际=3.14 秒]

7 月 18 日 14:52:46 fwprodcontent03 gc.log: 3179.616: [GC [PSYoungGen: 2161K->288K(2752512K)] 2751008K->2749135K(10092544K), 0.0688890 secs] [Times: user=0.42 sys=00. 0.07 秒]

7 月 18 日 14:52:49 fwprodcontent03 gc.log: 3179.686: [完整 GC [PSYoungGen: 288K->0K(2752512K)] [ParOldGen: 2748847K->2748930K(7340032K)] 2749135K->2749135K->274824430KPermGen:26 ->262143K(262144K)], 3.2369940 secs] [时间 s: user=32.23 sys=0.02, real=3.23 secs]

7 月 18 日 14:52:49 fwprodcontent03 gc.log: 3182.923: [GC [PSYoungGen: 0K->0K(2752512K)] 2748930K->2748930K(10092544K), 0.0607190 secs] [Times: user=0.39 sys=0.01, real= 0.06 秒]

7 月 18 日 14:52:57 fwprodcontent03 gc.log: 3182.984: [Full GC [PSYoungGen: 0K->0K(2752512K)] [ParOldGen: 2748930K->2748528K(7340032K)] 2748930K->2748528K(100932K4) [KPSYoungGen: 26241 ->262141K(262144K)],8.5377730 秒] [时间:用户=98.30 系统=0.57,实际=8.54 秒]

7 月 18 日 14:52:58 fwprodcontent03 gc.log: 3191.533: [GC [PSYoungGen: 202K->128K(2752512K)] 2748731K->2748656K(10092544K), 0.1088430 秒] [时间: user=0.67 sys=0.0 0.11 秒]

7 月 18 日 14:53:02 fwprodcontent03 gc.log: 3191.642: [完整 GC [PSYoungGen: 128K->0K(2752512K)] [ParOldGen: 2748528K->2748534K(7340032K)] 2748656K->274824434KPermGen:26 ->262143K(262144K)], 3.1761780 secs] [时间 s: user=31.11 sys=0.02, real=3.18 secs]

7 月 18 日 14:53:02 fwprodcontent03 gc.log: 3194.820: [GC [PSYoungGen: 0K->0K(2752512K)] 2748534K->2748534K(10092544K), 0.0589010 secs] [Times: user=0.38 sys=0.01, real= 0.06 秒]

7 月 18 日 14:53:05 fwprodcontent03 gc.log: 3194.879: [完整 GC [PSYoungGen: 0K->0K(2752512K)] [ParOldGen: 2748534K->2748529K(7340032K)] 2748534K->2748529K(1009529K(10095241)] ->262143K(262144K)],3.0554520 秒] [时间:用户=30.72 系统=0.03,实际=3.05 秒]。. 。更多的.....


提前致谢。

4

1 回答 1

10

你看过你的gc统计吗?

[Full GC [PSYoungGen: 0K->0K(2752512K)] [ParOldGen: 2748534K->2748529K(7340032K)] 2748534K->2748529K(10092544K) [PSPermGen: 262143K->262143K(262144K)], 3.0554520 secs]

重要的部分是[PSPermGen: 262143K->262143K(262144K)]。您PermGenSpace已经筋疲力尽,因此完成了完整的 GC。因此PermGenSpace进一步增加你来解决这个问题(也许通过减少你的堆空间一点点)。

也不要在不重新启动 Tomcat 的情况下经常在生产系统上部署,因为这会PermGenSpace很快耗尽你的精力。

于 2013-07-18T07:04:07.090 回答