2011-09-05 4 views
4

저는 짧은 생명체를 많이 생성하는 glassfish 서버에서 실행되는 거대한 응용 프로그램이 있으며 JVM에서 다음 GC 구성을 갖습니다.무한 GC로 인해 JVM이 멈 춥니 다.

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

그러나 JVM은 Infinite GC로 걸려 있습니다. JVM을 다시 시작해야합니다. GC Log에서 다음 정보가 나타납니다.

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 힙 덤프 정보가 있습니다. 추신 : 오래된 세대는 아무도 사용하지 않아도 대부분의 메모리를 보유하고있는 것으로 보입니다. 그것은 증가하지 않습니다 (메모리 누출의 경우).

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 로그는 가비지 콜렉터를 실행하는 매 15 초마다 JVM이 0.3 초를 소비하지 않는다는 것을 보여줍니다. –

답변

3

ParallelOldGC를 취소 할 수 있습니까? 메모리 조각이 발생하는 것으로 보입니다.

아니면 추가 할 수 있습니다

-XX

: + UseCMSCompactAtFullCollection 와 -XX ​​: CMSFullGCsBeforeCompaction = 0

또한 그것은 항상 보인다 서버 사이드 자바 애플리케이션에 사용되는 -server 추가 할 수 있습니다.

도움이 될지 확실하지 않습니다. 내가 할 수 없기 때문에 당신을 위해 그것을 시도하십시오.

1

확실하지가 있습니다,하지만 당신은 추가 PARAM 사용할 수 있습니다 GC 스레드의 기본 수를 줄이기 위해

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

합니다.

+2

스레드 수가 시스템의 CPU 코어 수와 같아야합니까? – AngerClown

+0

@AngerClown 이들은 GC 전용 스레드입니다.실제 계산을 위해 스레드를 해방하기 위해이 숫자를 기본값보다 낮은 값으로 팁을 설정합니다. 따라서 사용 가능한 총 스레드 수의 일부만 사용하면 안됩니다. –

0

문제는 Xmx와 Xms 모두 7g의 동일한 큰 값으로 설정 될 수 있습니다. 왜 Xms를 더 낮은 값으로 설정하지 않습니까? IMHO,이 문제를 해결해야합니다.

+0

우리는 이미 그것을 시도했다. XMS를 1G로 설정했지만이를 체포 할 수 없었습니다. 제안에 감사드립니다. –

관련 문제