이 기사는 Java 프로그램 메모리 오버플로가 더 자세한 이유를 분석합니다. 참조를 위해 모든 사람을 위해 공유하십시오. 세부 사항은 다음과 같습니다.
온라인 시스템이 발견 된 Java.lang.outofMemoryError : Permgen Space 오류가 발생하면 문제를 찾아야합니다. 나는 이것을 오래 전에 얻었고 지금은 그것을 기억하지 못하지만 이것은 정말 흥미로운 질문입니다. 우선, 첫 번째 반응은 -xx :+printgcdetails 매개 변수를 추가하여 특정 GC 로그를 살펴 보는 것이지만, 프로그램은 Tomcat에 의해 시작되었으므로 너무 많은 것들이 캡슐화되어 있다고 걱정합니다.
그런 다음이 오류의 원인을 살펴 보겠습니다.
Permgen Space의 전체 이름은 영구적 인 보존 영역을 의미합니다 )는 다른 힙 영역을 가지고 있습니다. GC (Garbage Collection)는 주행 순서 중에 Permgen 공간을 정리하지 않으므로 Permgen 공간 오류가 발생할 수 있습니다 웹 서버는 JSP에 사전 컴파일을 배치합니다. 웹 앱에서 많은 수의 세 번째 파티 항아리를 사용하는 경우 크기가 JVM의 기본 크기 (4m)를 초과하면이 오류 메시지가 생성됩니다.
그런 다음 Permgen의 초기 메모리 크기를 늘리겠습니다.
Catalina.sh 파일의 시작 부분에서 Linux의 시작 부분에 추가 : 다음과 같이 코드 코드를 복사하십시오. java_opts = "-xms1024m -xmx1024m -xx : permsize = 256m -xx : maxpermsize = 256m" "" "
또한 Windows에서 Catalina.bat 파일의 시작 부분에 : 다음과 같이 코드 코드 복사 : set java_opts = -xms1024m -xmx1024m -xx : permsize = 256m -xx : maxpermssize = 256m
그런 다음 여전히 시각적 메모리를 사용하여 특정 문제를 찾기 위해 도구를 볼 수 있습니다. JDK6에 선호되는 도구는 물론 자체 도구입니다. 이번에는 또 다른 이상한 문제, 즉 분석 도구가 열린 후에 Tomcat 프로세스를 찾을 수 없었습니다 (JRE는 나중에 시작된 것으로 밝혀졌으며 JDK로 변경하기에 충분해야합니다).
지역 지역은 허용되지 않으므로 원격으로 연결할 수 있습니다. JMX를 열 수 있습니다.
위의와 마찬가지로 Catalina.sh.sh 또는 Catalina.bat 파일의 java_opts의 시작 부분에 복사 코드 코드를 추가하십시오 : -djava.rmi.server.hostname = 192.168.1.101-dcom.management.jmxremote.port = 900 0--- dcom.sun.management.jmxremote.ssl = false -dcom.sun.management.jmxremote.authenticate = false
프로그램을 시작한 후에는 포트가 올바르게 열려 있는지 확인하여 리모컨을 연결할 수 있는지 확인하십시오.
나는 여기에 게으르고 인증을 끄는 것이 더 번거 롭습니다. 이 설정은 내 로컬 PC에서 효과적이지만 서버에서는 충분하지 않아 포트를 밀봉하고 포트를 1000으로 변경해야했습니다. jvisualVM을 열고 파일-> JMX 연결 추가를 클릭 한 다음 LocalHost : 1000을 추가하고 연결하십시오.
이전 프로그램 후, 일정 기간 동안 메모리 변화를 관찰 한 후, 나는 94m에서 안정화되어 하루 동안 달리는 것이 정상입니다. Perm의 기본 초기화는 16m이고 최대 값은 64m이고 실제 직업이 실제로이 문제를 일으킬 수 있기 때문에 Perm 메모리의 크기는 이전에 발효되지 않았을 수 있습니다. . 문제를 더 찾아야하는 경우 Btrace를 사용하여 특정 방법이 호출되는 장소를 볼 수도 있습니다. 이것은 특정 방법이 예상대로 실행되는지 여부를 배치 할 수 있습니다.
이 기사는 모든 사람의 Java 프로그램 설계에 도움이되기를 바랍니다.