2013-12-17 4 views
2

저는 Java7 애플리케이션을 2 ~ 3 주 동안 모니터했고 두 가지를 이해했습니다.JConsole 총로드 된 클래스 동작

응용 프로그램 시작부터로드 된 클래스의 수가 지속적으로 증가했습니다. 응용 프로그램 (netty 3.6 라이브러리 기반)이 열리고 닫힌 상태에서 많은 시간 동안 많은 TCP 연결이 끊어진 것 같아요. 나는 현재 수업이 적재 된 카운터가 커지지 않았기 때문에 이것에 대해서도 걱정해야한다고 생각하지 않는다.

내가 이해할 수없는 것은 약 7 일마다 총로드 된 클래스의 수가 현재 클래스가로드 된 카운터로 떨어지는 이유입니다. 또한 힙 메모리 사용은 동일한 패턴을 따르는 것으로 보입니다. 힙 공간은 70MB까지 증가한 다음 20MB로 감소합니다.

7 일마다 가비지 컬렉터가 실행될 때마다 실행됩니다.

응용 프로그램이 절대로 다시 시작되지 않았습니다.

누군가이 동작을 설명 할 수 있습니까? 감사.

P. 불행히도 JConsole의 스크린 샷을 가져갈 수 없습니다.

답변

3

Oracle JVM에는 힙에 여러 개의 메모리 풀이 있습니다. 그들 중 하나는 오래된 세대 수영장이고 다른 하나는 파마 세대 수영장입니다. 오래된 세대 풀에는 몇 가지 가비지 콜렉션에서 살아남은 객체가 포함되어 있습니다. perm gen 풀은로드 된 클래스와 다른 "영구"데이터를 포함합니다.

힙 풀은 가비지 수집 방식이 다릅니다. 자주 실행되는 표준 가비지 콜렉션은 새로 작성된 오브젝트가 배치되는 eden 풀에서 실행됩니다. 이 이론은 짧은 수명의 오브젝트가 많으면 작은 힙에서 가비지 콜렉션이 될 수 있다는 것입니다. 그 동안 오래 살았던 개체는 이전 풀로 승격되고 수집 빈도는 줄어 듭니다.

이것은 수명이 긴 오브젝트가 수명이 짧은 오브젝트처럼 자주 콜렉션되지 않으므로 더 효율적인 가비지 콜렉션을 허용하는 것입니다. 따라서보고있는 '더 깊은'실행은 오래된 세대 풀이 수집 될 때입니다. 오라클이 일을 구현하기로 결정했을 때, perm gen pool은 old gen pool과 동시에 garbage collection을 얻었습니다. 그 이유는 둘 다 동시에 drop됩니다.

마지막으로 TCP 연결을 열고 닫음으로써 새로운 클래스가로드되지 않아야합니다. 가능성있는 일은 연결이 도착할 때 일부 라이브러리가 새로운 동적 프록시를 작성한다는 것입니다. 이 동적 프록시는 런타임에 생성되는 새로운 클래스이며, 생성 될 때 총 클래스로드 횟수가 증가합니다.

참고 : (오라클)

In Java is Permanent Generation space garbage collected?

Java 6 garbage collection details