2013-03-07 3 views
2

저는 실행중인 고성능 Java 응용 프로그램에 Oracle 1.7.0_10 VM을 사용하고 있습니다. 저는 HPROF 프로파일 러에서 GC 할당량 (-verbose : gc 출력으로 측정)을 수행했기 때문에 메모리 할당을 보는 데 많은 시간을 보냈습니다. 이제 할당량은 거의 없지만 GC는 여전히 자주 실행되며 거의 작동하지 않으며 오랜 시간이 걸립니다. 예를 들어, 여기에 내가 특별한 GC 옵션 (-verbose:gc -XX:+PrintGCDetails -Xmx4g) 사용하지 않고있어 약간의 출력입니다 :이 일반 메시지는 2.5 초 벽 시간 동안 10 번 반복가비지 수집기가 JDK 1.7에서 계속 실행되는 이유는 무엇입니까?

[GC [PSYoungGen: 21197K->96K(1228224K)] 420220K->399118K(2045440K), 0.0081950 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 

[Full GC (System) [PSYoungGen: 96K->0K(1228224K)] [ParOldGen: 399022K->394779K(817216K)] 399118K->394779K(2045440K) [PSPermGen: 10758K->10758K(21248K)], 0.1503380 secs] [Times: user=0.89 sys=0.00, real=0.15 secs] 

[GC [PSYoungGen: 21195K->128K(1238592K)] 415974K->394907K(2055808K), 0.0061850 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 

[Full GC (System) [PSYoungGen: 128K->0K(1238592K)] [ParOldGen: 394779K->394779K(817216K)] 394907K->394779K(2055808K) [PSPermGen: 10758K->10758K(21248K)], 0.2534350 secs] [Times: user=1.71 sys=0.01, real=0.25 secs] 

는 - 대략 250 밀리의 자신의 타이밍에 따라,이 모든 과정 그 시간 동안 (나는 그것의 일부에 대한 다른 스레드에서 일을하고 있을지도 모른다) 이해하고있다. 저를 혼란스럽게하는 것은 많은 일이 진행되는 것 같지 않습니다. 메시지를 보면 모든 세대는 충분한 공간을 갖고있는 것 같습니다. 영은 21Mb> 0으로 나갑니다.하지만 1.2G가 할당되어 있으며 구 세대는 간신히 크기가 변하고 임계 값보다 훨씬 낮습니다.

이렇게하면 GC가 자주 실행되는 이유는 무엇입니까? 그리고 어쨌든 코어 i7에서 250ms가 걸리는 것처럼 보이지는 않습니다. 메모리가 거의 없기 때문에 아무것도 실행하지 않아도됩니다.

다른 GC 매개 변수를 사용해 보았지만 아무런 영향을 미치지 않았습니다. 불행히도 내 응용 프로그램은 1.7 특정 기능을 사용하므로 다른 VM에서는 실행할 수 없습니다.

답변

6

이렇게하면 GC가 자주 실행되는 이유는 무엇입니까?

"전체 GC (시스템)는"일반적으로 응용 프로그램이 명시 적으로 Runtime.getRuntime().gc() 또는 System.gc()를 호출하여 실행되는 가비지 컬렉터를 요청했음을 나타냅니다.

따라서 코드를 다시 확인해야 할 수 있습니다.

는 또한, Does java garbage collection log entry "Full GC (System)" mean some class called System.gc()?

+0

많은 감사를 참조 - 나는 꽤 많은 내부 라이브러리를 사용하고 있는데 그 중 하나가 이루어지는 시스템을 가지고 나타났다(). 이것을 제거한 후에 여분의 GC 호출이 사라지고 내 런타임이 30 % 감소했습니다. – user2144429

+1

-XX : + DisableExplicitGC를 사용하면 JVM이 System.gc()를 무시하도록 할 수 있습니다. –

관련 문제