최고의 PermGen 처리 기능을 갖춘 무료 JVM 구현은 무엇입니까?
문제
저는 Sun의 JRE6에서 Tomcat6을 실행하고 있으며 배포할 때마다 OutOfMemoryException이 발생합니다.PermGen.저는 PermGen 솔루션에 대한 인터넷 검색을 수행하고 많은 수정 사항을 시도했습니다.작동하지 않습니다.저는 Oracle의 JRockit과 PermGen 할당의 크기가 어떻게 기가바이트일 수 있는지(Sun의 128M에 비해)에 대한 많은 좋은 내용을 읽었으며 문제가 해결되지는 않지만 2와 비교하여 PermGen 예외 간에 100배 재배포할 수 있습니다. 지금은 몇 번이나.
JRockit의 문제점은 프로덕션 환경에서 이를 사용하려면 수천 달러의 비용이 드는 WebLogic을 구입해야 한다는 것입니다.PermGen 확장을 더 관대하게 해주는 다른 (무료) 옵션은 무엇입니까?아래 JVM은 이 영역에서 어떻게 작동합니까?
- IBM JVM
- JDK 열기
- 블랙다운
- 카페
...다른 사람들?
업데이트: 어떤 사람들은 PermGen max가 128M이라고 생각하는 이유를 묻습니다.그 이유는 128M 이상으로 높이려고 할 때마다 JVM이 초기화되지 않기 때문입니다.
[2009-06-18 01:39:44] [info] Error occurred during initialization of VM
[2009-06-18 01:39:44] [info] Could not reserve enough space for object heap
[2009-06-18 01:39:44] [395 javajni.c] [error] CreateJavaVM Failed
개체를 위한 공간을 예약하는 데 실패하는 것이 이상합니다. 더미, "a" 힙이 아닌 "the" 힙인지는 확실하지 않습니다.
초기 1024MB, 최대 힙 1536MB로 JVM을 부팅합니다.
답변이 되었으므로 이 질문을 닫겠습니다."전환은 쓸모가 없습니다"라고 대신 물어보세요 PermGen 설정이 더 크면 Sun JVM이 실패하는 이유는 무엇입니까?
해결책
나는 당신이 Permgen 크기를 늘릴 수 있다는 점에서 Michael Borgwardt에 동의합니다. 주로 메모리 누출로 인한 것이라고 동의하지 않습니다. Permgen Space는 반사를 많이 사용하는 응용 분야에 의해 적극적으로 먹습니다. 따라서 기본적으로 Tomcat에서 스프링/최대 세분 애플리케이션이 실행중인 경우 해당 페름기 공간을 많이 부딪 칠 준비를하십시오.
다른 팁
기술적으로 "Permgen"메모리 풀은 Sun JVM입니다. 다른 JVM은 그것을 부르지 않지만 모두 하나 이상의 비가 비 이식 메모리 풀에 대한 아이디어를 가지고 있습니다.
그러나 Sun JVM에서 Permgen에 문제가있는 경우 다른 JVM으로 이동하는 것은 아무것도 해결할 것 같지 않습니다. 다른 이름으로 나타납니다.
여러 재배치로 인해 문제가 발생하면 VM의 Permgen을 큰 값으로 높이십시오. 우리는이 문제로 인해 잠시 jrockit을 시도했으며 동일한 재배치 피로로 고통받습니다. 우리는 Sun JVM으로 돌아 왔습니다.
JVM을 바꾸는 것은 만병 통치약이 아닙니다. 새로운 예상치 못한 문제를 얻을 수 있습니다 (예 : 참조 기사 4 개의 다른 JVM에서 응용 프로그램을 시작하는 정보).
- 대부분 재배치에서 발생하는 클래스 누출 (예 : 클래스 로더를 통해)을 가질 수 있습니다. 솔직히, 나는 Tomcat에서 뜨거운 재배치를하는 것을 본 적이 없다 (하루를 보길 희망).
- 잘못된 JVM 매개 변수를 가질 수 있습니다. 상황이 해결 될 것입니다. 재미 있지만, 나는 위에서 언급 한 적이없는 Sun JDK 6 32 비트)를 만난 적이 없습니다. 링크 "생산 배치를위한 JVM 쓰레기 수집 조정"기사에.
- Permgen 청크는 클래스 및 관련 정보를로드하기에 충분하지 않을 수 있습니다 (실제로 Tomcat에서 재개 후에는 대부분 발생하는 경우에 구식 클래스가 메모리에 머무르고 새로운 것들이로드되고 있습니다)
내 과거의 경험에서, 그런 종류의 누출을 디버깅하는 것은 내가 가진 가장 까다로운 디버깅 중 하나입니다.
업데이트
유용한 기사 애플리케이션에서 클래스 로더 링크를 제거하는 방법은 재생됩니다.
Jrockit을 사용하고 메모리를 통해 (-xx : maxpermsize를 통해) 부딪치지 않으면 여전히 Permgen 오류가 발생합니다. 나는 또한 이것을 얻는 것을 피하기 위해 아무것도 얻을 수 없습니다 (증가하는 것 외에).
Perm Gen은 아마도 가장 간단한 메모리 일 것입니다. 다양한 VM 구현 사이에 많은 차이가있을 것입니다.
프로덕션에서 끄기로 표시된 모든 Tomcat 구성이 생산에서 꺼져 있는지 확인하십시오.
그렇습니다. 많은 클래스를 생성하는 일부 프레임 워크는 파리를 생성하지만 스스로 청소해야하며 어쨌든 128MB의 몇 개 이상을 장착 할 수 있습니다.
진지하게, Perm Gen이 계속 올라가면 누출 A는 고정되어야하지만 고치는 것은 문제가되지 않을 수 있습니다.
그만큼 IBM JVM 는(그리고 2009년에도) 퍼미젠을 갖고 있지 않습니다.이에 대한 자세한 내용을 읽을 수 있습니다. 세대별 동시 가비지 수집기 이는 Java 7의 기본 GC입니다.
내가 가장 좋아하는 플러그인을 사용하면 HotSpot JVM의 permgen이 자주 채워지기 때문에 IBM JVM에서 Eclipse IDE를 실행하는 경우도 있습니다.물론, 누군가가 고쳐야 할 메모리 누수가 있었을 수도 있지만, 그러는 동안 내 IDE는 충돌하지 않았고 다른 설정을 실험하느라 바쁘지도 않았습니다.