>Java >java지도 시간 >jvm 메모리 오버플로 솔루션(jvm 메모리 오버플로 해결 방법)

jvm 메모리 오버플로 솔루션(jvm 메모리 오버플로 해결 방법)

高洛峰
高洛峰원래의
2017-01-23 10:09:231244검색

java.lang.OutOfMemoryError: PermGen space

많은 사람들이 문제의 원인을 spring, hibernate, tomcat으로 생각하는 것으로 나타났습니다. 이는 동적으로 클래스를 생성하여 JVM의 영구 힙이 오버플로되기 때문입니다. 그런 다음 다른 솔루션이 있습니다. 일부 사람들은 Tomcat 버전을 최신 버전으로 업그레이드하거나 Tomcat을 전혀 사용하지 않는다고 말합니다. 어떤 사람들은 스프링의 문제를 의심하기도 하며, 스프링 포럼에서는 스프링이 AOP에서 CBLIB를 사용하여 동적으로 많은 클래스를 생성하기 때문에 토론이 매우 치열합니다.
그런데 왜 이런 ace 오픈소스 프로젝트가 같은 문제를 안고 있는지가 더 근본적인 이유일까요? Tomcat은 Q&A에서 이 점에 대해 매우 암묵적으로 대답했습니다. 우리는 이 문제를 알고 있지만 이 질문은 보다 기본적인 질문에서 비롯됩니다.
그래서 누군가가 좀 더 기본적인 JVM을 확인하고 문제의 핵심을 찾았습니다. SUN의 JVM은 메모리를 여러 영역으로 나누는 것으로 나타났는데, 그 중 하나는 자주 사용되는 클래스와 클래스 설명을 저장하는 데 사용되는 permenter 영역입니다. SUN이 처음 설계할 당시에는 JVM이 시작되면 이 부분이 수정될 것이라고 생각했지만 지금처럼 다이나믹이 널리 사용될 것이라고는 예상하지 못했습니다. 게다가 이 영역에는 특별한 가비지 수집 메커니즘이 있습니다. 이제 문제는 클래스를 이 영역에 동적으로 로드한 후 GC가 클래스를 전혀 수집할 수 없다는 것입니다.

1. 첫 번째는 java.lang.OutOfMemoryError: Java 힙 공간

설명:

힙 크기 설정

JVM 힙 설정은 다음을 의미합니다. java JVM은 프로그램 실행 중에 사용되는 메모리 공간 설정을 할당할 수 있습니다. JVM은 시작 시 자동으로 힙 크기 값을 설정합니다. 즉, -Xms는 실제 메모리의 1/64이며 최대 공간입니다. (-Xmx)는 실제 메모리의 1/4입니다. -Xmn -Xms -Xmx 및 JVM에서 제공하는 기타 옵션을 사용하여 설정할 수 있습니다. Heap 크기의 크기는 Young Generation과 Tenured Generation의 합입니다.
팁: JVM에서는 98%의 시간이 GC에 사용되고 사용 가능한 힙 크기가 2% 미만인 경우 이 예외 메시지가 발생합니다.
팁: 최대 힙 크기는 사용 가능한 물리적 메모리의 80%를 초과할 수 없습니다. 일반적으로 -Xms 및 -Xmx 옵션은 동일한 값으로 설정되어야 하며, -Xmn은 -Xmx 값의 1/4이어야 합니다. .

해결책:

힙 크기를 수동으로 설정하세요.
TOMCAT_HOME/bin/catalina.bat를 수정하고 "echo "Using CATALINA_BASE: $CATALINA_BASE"" 위에 다음 줄을 추가하세요.

set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m

또는 catalina.sh를 수정합니다.
"echo "Using CATALINA_BASE: $CATALINA_BASE"" 위에 다음 줄을 추가합니다.

JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m" 
[html]
2、其次是:java.lang.OutOfMemoryError: PermGen space
原因:
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法:
1. 手动设置MaxPermSize大小 
修改TOMCAT_HOME/bin/catalina.bat(Linux下为catalina.sh),在
[code]
“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: 
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m

catalina.sh는 다음과 같습니다.

JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"

더 보기 jvm 메모리 오버플로 솔루션(jvm 메모리 오버플로 해결 방법) 관련 기사를 PHP 중국어 웹사이트에 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.