2011-05-11 2 views
2

우리는 거대한 개발중인 대규모 Java 기반 응용 프로그램을 실행합니다. 3 개월에서 6 개월마다 PERM 메모리의 크기를 늘려야하거나 응용 프로그램이 시작될 때 또는 잠시 후에 온라인 상태가 될 때 메모리가 부족할 위험이 있습니다. 응용 프로그램은 JBoss 4.2 및 tomcat 서버에서 호스팅됩니다. Java에서의 PERM은 얼마입니까 (1.5GB가 높음)

우리의 현재 설정

은 다음과 같습니다

-server -Xms12G -Xmx12G -XX :를 MaxPermSize = 1536M -XX : + UseConcMarkSweepGC -XX : + CMSIncrementalMode

내가 도움이되지만 궁금 수

이 끔찍한 보인다 경우 높은.

시작시 PERM 메모리가 매우 빠르게 채워진 것 같습니다. jstat를 사용하여 90 %에서 99 % 사이의 아무 곳이나.

웹 응용 프로그램은 30 개 이상의 개별 war 파일로 구성됩니다. JBoss에서 이들은 300MB + ear 파일 하나로 배포됩니다.

대규모 응용 프로그램의 경우 이처럼 많은 PERM이 발생합니까?

+0

아마도 앱을 해킹 할 시간이 되었습니까? 이 300MB EAR 파일에는 무엇이 있습니까? 그래픽과 다른 내용이 있어야합니다. 어쩌면 정적 인 내용을 웹 서버가 제공하도록 옮기고 AppServer가 로직을 수행하게 할 수 있습니다. –

+1

이것은 정말로, 정말로, 정말로, 정말로 높게 보인다. 추천할만한 것이 없지만 코드베이스는 얼마나 큽니까? 다른 클래스 로더에서 여러 개의 라이브러리 사본을로드 할 수 있습니까? 문제가보고되었다는 것을 제외하고는 현재 JBoss Classloader에 익숙하지 않습니다. 다른 컨테이너에서도 비슷한 결과를 얻었습니까? –

+0

코드베이스가 상당히 큽니다 (ERP 시스템). EAR 파일 (공용 라이브러리)에서 "공유"된 100 개 이상의 외부 jar 라이브러리 (일부는 선반에서 꺼내 진 일부 고객)가 있지만 각 독서에서 각자의 복사본을 얻는 것처럼 보일 것입니다. 그게 사실이야? – jrhickey

답변

6

많은 permgen 공간이 있습니다. 그것이 즉시 채워지면, 그것은 거의 상상할 수없는 수업의 수를 의미합니다. 30 개의 전쟁 파일 전체에 걸쳐 라이브러리에 많은 복제본이 있습니까? 각 분리 webapp보다는 루트에 가까운 공통 클래스 로더에서 공통 라이브러리를로드하여 많은 공간을 절약 할 수 있습니다. 서버 디렉토리에 공통 라이브러리를 설치하십시오.

+1

interned Strings는 permgen 공간을 사용하므로 프로필러를 사용하여 많은 메모리를 사용하고 있는지 확인합니다. 그리고 중복이있는 경우. –

+0

필자가 아는 한 모든 공통 jar는 EAR의 lib 디렉토리 또는 tomcat의 공통 lib 디렉토리에 있습니다. 위의 내용과 일부 읽기에서는 각 전쟁이 lib 파일의 복사본을로드하지만 여전히이를 확인하려고하는 것처럼 보입니다. – jrhickey

0

클래스 코드/정적 데이터뿐만 아니라 12GB 힙을 관리하기 위해 1.5GB의 오버 헤드가 발생합니까?

0

응용 프로그램에 메모리 누수가 있다고 생각하십니까? JProfiler 또는 Eclipse MAT과 같은 프로파일 러 도구를 사용하여 응용 프로그램의 메모리 사용을 분석하십시오. 간단한 메모리 누수가 일정 기간 동안 큰 혼란을 야기 할 수 있다는 것을 알았습니다.

+0

예. 내가 팀으로 돌아 가기 전에 몇 가지 추가 의견을 듣고 싶었습니다. 인터넷이 내 가정을 확인한 것 같습니다. – jrhickey