JAVA 프로그램 메모리 넘침 문제 원인 분석

본고는 JAVA 프로그램의 메모리 넘침 문제의 원인을 비교적 상세하게 분석하였다.여러분에게 참고할 수 있도록 나누어 드리겠습니다.구체적으로 다음과 같습니다.
온라인 시스템을 만났습니다.lang.OutOfMemoryError:PermGen space 오류입니다. 문제를 찾아야 합니다.오래 전에 그때 이걸 해봤는데 지금은 기억이 안 나요. 그런데 이건 정말 재미있는 문제예요. 잘 연구해 볼 만해요.우선 첫 번째 반응은 당연히 -XX:+PrintGCDetails 파라미터를 추가하여 구체적인 GC로그를 보는 것이지만 프로그램은tomcat에서 시작되었기 때문에 안에 봉인된 물건이 너무 많아서 위치를 정하기 어려울까 봐 걱정됩니다. 윈도우즈 아래에 있으니 시각화 도구를 빌리는 것이 좋습니다.
그리고 우리는 이 오류의 발생 원인을 살펴보고 인터넷에서 설명을 찾았는데 아주 잘했다. 붙여서 빌려 쓰자.)
PermGen space의 전칭은 Permanent Generation space로 메모리의 영구 저장 구역을 가리킨다. 이 메모리는 주로 JVM에 의해 Class와 Meta 정보를 저장한다. Class는 Loader에 저장될 때 PermGen space에 저장된다. 이것은 저장 클래스 실례(Instance)의 Heap 구역과 다르다. GC(Garbage Collection)는 메인 프로그램 실행 기간에 PermGen space를 정리하지 않기 때문에 응용 프로그램에 CLASS가 있다면,PermGen space 오류가 발생할 수 있습니다. 이런 오류는 웹 서버에서 JSP를pre compile할 때 흔히 볼 수 있습니다.만약 당신의 WEB 앱에서 대량의 제3자jar를 사용했다면, 그 크기가 jvm의 기본 크기(4M)를 초과하면 이 오류 메시지가 발생합니다.
그러면 PermGen의 초기 메모리 크기를 늘립니다.
linux에서catalina.sh 파일의 시작 부분에:
JAVA_OPTS="-Xms1024m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=256m" 
윈도우즈 아래catalina.bat의 파일 시작 부분에:
set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=256M -XX:MaxPermSize=256m 
이어서 우리는 시각화된 메모리 보기 도구로 구체적인 문제를 포지셔닝했다.jdk6에 대한 첫 번째 선택은 당연히 자신이 가지고 있는 도구입니다. 비교적 자주 사용하는 것은 jconsole와 jvisualvm입니다. (사용한 후에 후자가 더욱 강력하다는 것을 발견했습니다. 풍부한 플러그인 지원이 있기 때문입니다.)이번에 또 하나의 괴이한 문제에 부딪혔다. 바로 분석 도구가 열려 있는 후에tomcat 프로세스를 찾을 수 없다는 것이다. (사후에 jre가 시작된 것을 발견하고 jdk로 바꾸면 될 것이다.)
로컬에서 연결하지 못하게 하는 이상 원격으로 연결할 수 있습니다. JMX를 켜면 됩니다.
위와 같이,catalina에서.sh 또는catalina.bat 파일의 시작 JAVA_OPTS에 더하기.
-Djava.rmi.server.hostname=192.168.1.101 -Dcom.sun.management.jmxremote.port=9000 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
시작 프로그램은 원격 연결이 가능한지 확인하기 위해 넷stat으로 포트가 올바르게 열려 있는지 확인합니다.
나는 게으름을 피워서 authenticate를 껐다. 권한을 설정해야 할 물건을 열면 비교적 번거롭다.이 설정은 내 로컬 PC기에서 효력이 발생하지만 서버에서 뜻밖에도 안 된다. 어떤 소프트웨어를 설치하여 포트를 봉했는지 나는 어쩔 수 없이 다시 천박하게 포트를 1000으로 바꾸었다.jvisualvm를 열고 file ->add JMX connection을 누르고 localhost:1000을 추가하면 연결됩니다.
프로그램에 연결된 후에 한동안 메모리 변화 상황을 관찰한 후에 나는 Perm의 상황을 중점적으로 보았고 94m에 안정된 모습으로 하루 동안 모든 것을 정상적으로 운행했다.이전에 설정된 Perm 메모리 크기가 적용되지 않았을 수도 있습니다. Perm의 기본 초기화는 16m, 최대 64m이기 때문에 실제 사용량은 확실히 이 문제를 초래할 수 있습니다. 현재의 현상으로 볼 때 이 문제는 다시는 발생하지 않을 것입니다.만약 더 많은 포지셔닝 문제가 필요하다면, btrace를 사용하여 어떤 방법이 구체적으로 호출된 곳을 볼 수 있다.이렇게 하면 어떤 방법이 예상대로 실행되는지 확인할 수 있다.
본고에서 기술한 것이 여러분의 자바 프로그램 설계에 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기