2011-10-07 3 views
30

최대 절전 모드 및 glassfish 서버를 사용하여 Java 웹 응용 프로그램을 실행 중입니다. 나는 여러 번 배포 한 후에 예외가 발생하면PermGen 공간 오류 - Glassfish 서버

java.lang.OutOfMemoryError: PermGen space을 예외로합니다.

내 환경 변수에 -XX:MaxPermSize=128M을 시도했지만 작동하지 않습니다.

+0

찾으시는 분 이것은 : http://stackoverflow.com/questions/1996088/java-class-permgen-memory-leak-web-applications-generic-solution – Raedwald

답변

37

이것은 클래스 로더 메모리 누수가. 응용 프로그램을 다시 전개 할 때마다 새 클래스 로더가 작성되고 응용 프로그램의 모든 클래스가 다시로드됩니다. 이것은 perm gen 공간에서 메모리를 소비합니다.

오래된 클래스 로더와로드 된 모든 클래스를 가비지 수집해야합니다. 그렇지 않으면 결국 여러 번 배포 한 후 결국 PermGen 스페이스 OOME으로 실행됩니다. 외부 클래스 로더에 의해로드 된 오브젝트가 이전 클래스 로더에 의해로드 된 오브젝트에 대한 참조를 보유하는 경우에는 작동하지 않습니다. This article은 문제에 대한 좋은 설명을 제공합니다.

일반적으로 클래스 로더 누출은 분석하기가 어렵고 수정하기가 어렵습니다. 오래된 클래스 로더가 가비지 수집되지 않는 이유를 확인하려면 프로파일 러를 사용해야합니다. JProfiler에서 힙 워커를 사용하고 glassfish 클래스 로더 오브젝트를 선택하고 들어오는 참조 뷰를 사용하여 가비지 콜렉터 루트에 대한 경로를 확인하십시오.

클래스 로더 클래스는 org.apache.servlet.jasper.JasperLoader입니다. 다음은 클래스 로더가로드 된 객체의 실제 인스턴스에서만 보유되는 일반 상황의 스크린 샷입니다. 상황에

enter image description here

, 당신은 외부 객체에서 참조를 볼 수 있습니다. 웹 컨테이너에서 클래스 로더 누출의 다른 일반적인 원인은 백그라운드 스레드가 중지되지 않은 것입니다. Google Guice는 예를 들어 3.0에 버그가 있습니다.

(부인 성명 : 내 회사가 JProfiler와 개발) (리눅스 기반 운영 체제에서)이 문제를 해결하기 위해

5

이 문제는 여러 번 반복 배포시 발생합니다. 나는 여러 번 이것을 직면했다. 글래스 피쉬 버그 JIRA 링크 아래를 참조하십시오 :

http://java.net/jira/browse/GLASSFISH-587

+1

그 해의 버그 보고서를 보았습니까? ?! –

46

다음을 수행

1) 증가 메모리 (이 문제가 자주 오지 않도록)으로 구성 "도메인.

<jvm-options>-XX:MaxPermSize=

set it to higher value eg- 198m or 256m

2)가 실행 된 포트를 확보하기 위해 글래스 피쉬 프로세스를 종료

/글래스 피쉬/도메인의 XML "/ domain1을/설정

검색 (내 경우 8686) 오픈 터미널 (Linux 기반 OS) 및 유형 -

이 같은 발생합니다 617,451,515,

sudo netstat -npl | grep 8686

..

tcp6 0 0 :::8686 :::* LISTEN 3452/java

다음 사용

kill -9 3452가 시작하려고 지금 (이 경우 3452) 그 과정

을 죽일 글래스 피시, 시작해야합니다.

+0

고마워요! 아주 좋아! –

9

Windows를 사용하는 경우 작업 관리자로 glassfish 프로세스 (java.exe * 32)를 종료 한 다음 서버를 다시 시작하십시오.

+0

이것은 완벽합니다. –

관련 문제