2011-09-05 100 views
4

我有一个运行在glassfish服务器上的巨大应用程序,它创建了大量短期存在的对象,并且我在JVM中具有以下GC配置。JVM由于无限GC而挂起

-XX:+DisableExplicitGC 
-XX:+UseParallelGC 
-XX:+UseParallelOldGC 
-XX:-UseAdaptiveSizePolicy 
-XX:PermSize=256m 
-XX:MaxPermSize=1024m 
-Xms7g 
-Xmx7g 
-XX:NewRatio=2 

但是JVM挂着无限的GC。我必须重新启动JVM。我从GC日志中获得以下信息。

2.855: [GC 734029K->9736K(7034240K), 0.0133500 secs] 
2.869: [Full GC 9736K->9501K(7034240K), 0.1043570 secs] 
13.254: [GC 681231K->26506K(7034240K), 0.0251050 secs] 
13.280: [Full GC 26506K->26082K(7034240K), 0.2904930 secs] 
13.589: [GC 103156K->26224K(7034240K), 0.0015940 secs] 
13.590: [Full GC 26224K->24440K(7034240K), 0.2254710 secs] 
35.478: [GC 1859512K->131673K(7034240K), 0.0781300 secs] 
41.603: [GC 1966745K->351954K(7034240K), 0.1858590 secs] 
46.012: [GC 2187026K->502362K(7034240K), 0.2329020 secs] 
51.850: [GC 2337434K->608654K(7034240K), 0.2012410 secs] 
72.584: [GC 2443726K->727923K(7034240K), 0.2203390 secs] 
80.239: [GC 2562995K->894770K(7034240K), 0.2323490 secs] 
106.221: [GC 2729842K->1265916K(7034240K), 0.2800630 secs] 

请让我知道jvm GC设置是否适合此用例。或者任何帮助解决这个问题,非常感谢。

更新 我也有jmap堆转储信息。 PS即使没有人使用它,老一代似乎仍然保留着大部分内存。它不会增加(这会在内存泄漏的情况下)。

using thread-local object allocation. 
Parallel GC with 8 thread(s) 

Heap Configuration: 
    MinHeapFreeRatio = 40 
    MaxHeapFreeRatio = 70 
    MaxHeapSize  = 7516192768 (7168.0MB) 
    NewSize   = 5439488 (5.1875MB) 
    MaxNewSize  = 17592186044415 MB 
    OldSize   = 5439488 (5.1875MB) 
    NewRatio   = 2 
    SurvivorRatio = 8 
    PermSize   = 268435456 (256.0MB) 
    MaxPermSize  = 1073741824 (1024.0MB) 

Heap Usage: 
PS Young Generation 
Eden Space: 
    capacity = 2244935680 (2140.9375MB) 
    used  = 863166976 (823.18017578125MB) 
    free  = 1381768704 (1317.75732421875MB) 
    38.44951923076923% used 
From Space: 
    capacity = 112525312 (107.3125MB) 
    used  = 47609824 (45.404266357421875MB) 
    free  = 64915488 (61.908233642578125MB) 
    42.31032392071928% used 
To Space: 
    capacity = 114753536 (109.4375MB) 
    used  = 0 (0.0MB) 
    free  = 114753536 (109.4375MB) 
    0.0% used 
PS Old Generation 
    capacity = 5010817024 (4778.6875MB) 
    used  = 4385643424 (4182.475494384766MB) 
    free  = 625173600 (596.2120056152344MB) 
    87.52351967741699% used 
PS Perm Generation 
    capacity = 458031104 (436.8125MB) 
    used  = 432700088 (412.6549606323242MB) 
    free  = 25331016 (24.15753936767578MB) 
    94.46958606549131% used 
+3

为什么使用ParallelOldGC?这难道不比普通的一个更糟吗? –

+4

我没有看到任何GC无限的证据。你能否给我们记录在你杀死它之前发生的事情? –

+2

我同意@Peter Lawrey。这在我看来就像你的应用程序中的一个无限循环。如果我正确地阅读它,GC日志显示JVM每15秒运行垃圾收集器花费的时间就会少于0.3秒。 –

回答

3

您可以取消ParallelOldGC吗? 它似乎会导致内存碎片。

或者你可以尝试添加

-XX:+ UseCMSCompactAtFullCollection 和-XX:CMSFullGCsBeforeCompaction = 0

你也可以添加-server 它似乎总是被用于服务器端Java应用程序。

不知道它是否有帮助。因为我不能 为你尝试。

1

不知道有帮助,但你可以使用一个额外的PARAM:

 -XX:ParallelGCThreads=10 //10 threads for GC 

减少GC线程的默认数量。

+2

线程数量是否应等于系统中CPU内核的数量? – AngerClown

+0

@AngerClown这些是专用于GC的线程。您会将此数字设置为比默认值更低的值,该值可能过高,以便为实际计算释放线程。所以你不应该使用可用线程总数的一小部分。 –

0

问题可能是Xmx和Xms都设置为相同的7g大值。为什么不将Xms设置为较低的值?恕我直言,这应该纠正。

+0

我们也已经尝试过了。我们将Xms设置为1G,但我们无法阻止这一点。感谢您的建议。 –