2010-12-02 3 views
2

가끔 발생하는 문제에 대한 정보를 수집하려고합니다. 몇 주 후에 응용 프로그램이 느려지고 작동이 잘되고 느려지고 작동이 느리고 잘 작동하는 간격이 짧아지고 짧아집니다. . 내 이론은 시간이 지날수록 더 자주 쓰레기를 수집한다는 것입니다. 다른 중요한 정보는 때때로 우리가 OOM PermGen 문제를 경험했기 때문입니다.자바 : 'tenured'메모리가 permgen과 같은가요?

활성화 된 verbose : gc를 입력하면 catalina.out에 GC 출력이 표시됩니다. 나는 여기에 정보를 기반으로하지만, PrintGCDetails 플래그를 추가 할 필요가 있다고 생각 :

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

는 후자의 플래그가 "종신"메모리 컬렉션 정보를 출력 할 것이다. 문제는 PermGen 오류를 일으키는 메모리가 무엇인가, 아니면 뭔가 다른 것입니까? 그리고 다른 경우 PermGen 공간을 표시하는 정보를 어떻게 기록 할 수 있습니까?

EDIT - 불행히도이 환경에서는 jvm 모니터링 도구를 연결할 수 없습니다.

편집 - 나는

27.701: [GC 27.701: [ParNew 
Desired survivor size 2162688 bytes, new threshold 4 (max 4) 
- age 1: 1906560 bytes, 1906560 total 
- age 2:  2064 bytes, 1908624 total 
- age 3:  5064 bytes, 1913688 total 
- age 4:  650368 bytes, 2564056 total 
: 35684K->2678K(38336K), 0.0068580 secs] 224179K->191173K(1065664K), 0.0069700 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 

같은 물건이 ParNew의 세대 permgen 공간입니다 얻을, 상기 구성 옵션뿐만 아니라, 보유 기간 분포를 인쇄 한 추가?

(concurrent mode failure): 25387K->31940K(1027328K), 0.2983200 secs] 50714K->31940K(1065664K), [CMS Perm : 35273K->35139K(35392K)], 0.2985210 secs] [Times: user=0.30 sys=0.00, real=0.30 secs] 
(concurrent mode failure): 25356K->31941K(1027328K), 0.3032690 secs] 50861K->31941K(1065664K), [CMS Perm : 35264K->35129K(35392K)], 0.3034800 secs] [Times: user=0.30 sys=0.00, real=0.31 secs] 

실패는 저를 괴롭 히고 있습니다.

고지 사전

+0

당신은 JMX를 활성화하고 VisualVM으로 Vm을 볼 수 있습니다 ... – ZeissS

+0

우리 환경에서 옵션이 아닌 모든 것이 잠겨 있습니다 : ( – hvgotcodes

답변

4

Tenured와 PermGen은 같지 않습니다. 그것들은 관련되어 있지만 같은 것은 아닙니다. 정확한 세부 정보는 사용중인 JVM의 구현에 따라 달라 지지만 연결된 문서의 내용은 다음과 같습니다.

"장기 생성과 밀접하게 관련된 3 세대는 영구 생성입니다. Java 언어 수준에서 동등하지 않은 개체를 설명하기 위해 가상 컴퓨터에 필요한 데이터입니다. 예를 들어 클래스 및 메서드를 설명하는 개체는 영구 생성에 저장됩니다. "

인턴 된 문자열 및 클래스 정보 등은 일반적으로 PERM에 저장되는 반면, 긴 수명의 Java 객체는 TENURED입니다. 여기

괜찮은 문서 (방법을 조정할 등) PermGen을 설명한다 : http://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation

+0

링크를 가져 주셔서 감사합니다. 내가 게시 한 기사에서. permgen 정보를 덤프하는 jvm을 얻는 방법에 대해서는 아무것도 표시되지 않습니다. 그 정보도 놓치지 않았습니까? – hvgotcodes

+0

이 링크는 내가 추가하려고하는 플래그가 permgen 정보를 인쇄하지 않음을 나타냅니다. http://rajakannappan.blogspot.com/2010/01/outofmemoryerror-on-heapspace-permgen.html – hvgotcodes

+0

그래, 일반 -XX : + PrintGCDetails (Sun VM 사용)에서 PermGen 통계가 표시됩니다. 또한 나중에 Grails 앱이라는 코멘트에서 런타임시 클래스를 조작 할 때 PermGen 객체가 나타나기까지 시간이 걸릴 것이라고 생각합니다. 간단히 말해서 up은 도움이 될 것입니다.하지만 일반적으로 느린 부분에 대해서는 프로파일 러 (profiler)를 실행할 항목을 알아 내고 싶을 것입니다. (아마도 여러분이 문제를 재현하려고 시도하는 테스트 서버 일 수도 있습니다. prod를 모니터 할 수 없습니까?). –

1

당신은 어떤 문자열 인턴 또는 클래스를 로딩하고 있습니까?

permgen 공간을 먹어 버렸던 두 가지 사실은 인턴 스가 없어야합니다. (따라서 모든 종류의 ungarbagecollectable String을 만들 수 있습니다.) 새로운 클래스를로드함으로써 발생하는 오래된 클래스 정의입니다. Tomcat 재배포, 12 개 정도 후에 이것은 우리에게 일어날 수있다).

나는 Tomcat 6이 재배포 문제에서 더 뛰어 났고 7 명이 그것을 고쳐야한다고 생각한 것 같다.하지만 그건 내 머리 꼭대기에서 떨어져있다.

외부 라이브러리 또는 원시 코드 라이브러리를 사용합니까? permgen (단지 추측)에 대해 누출되는 리소스가 누적되면 놀라지 않을 것입니다.

+0

이것은 다시 시작하지 않습니다. 발행물. 우리는 정상적인 작동 중에 permgen을 다 써 버린다. 이 프로그램은 Grails 앱이므로 런타임에 동적으로 생성되는 모든 종류의 것들이 있습니다. 이것에 대해서, 나는 단지 정보를 수집하려고 노력하고 있습니다 - 어떻게 jvm이 permgen 정보를 출력 할 수 있습니까? – hvgotcodes

+0

[중복 삭제 주석] – hvgotcodes

+0

@ gvgotcodes - 다시 시작하면 클래스로드가 많이 발생합니다. 클래스 정의를 변경할 때마다 Groovy가 클래스를 다시 생성해야합니다. 그러면 클래스가로드됩니다. 문제가 발생하면 시간이 지나면 충분할 수 있습니다. 무슨 일이 일어나고 있는지 알아 내려면 jstat 도구 (Java의 일부)를 사용해야합니다. 그래도 까다 롭습니다. 현재 서버에서 실행할 수 없으며 Java가 표시되지 않는다고 말합니다. 당신이 말한 JXM 모니터링은 더 쉽습니다. – MBCook

관련 문제