Heap
The Java virtual machine heap is the area of memory used by the JVM (and specifically HotSpot) for dynamic memory allocation.[10] The heap is split up into "generations":
- The young generation stores short-lived objects that are created and immediately garbage collected.
- Objects that persist longer are moved to the old generation (also called the tenured generation).
- The permanent generation (or permgen) is used for class definitions and associated metadata.[11][12]
Originally there was no permanent generation, and objects and classes were stored together in the same area. But as class unloading occurs much more rarely than objects are collected, moving class structures to a specific area allows significant performance improvements.[11]
source -
http://en.wikipedia.org/wiki/Java_virtual_machine
How do you determine a good MaxPermSize?에서 Matt 가 OOM(OutOfMemory) 에러에 시달리는데, -Xmx 사이즈를 아무리 늘려도 해결이 안됐었나 보다.
설명에 의하면 클래스의 메타 정보는 -Xmx 로 지정되는 메모리 영역이 아닌 MaxPermSize로 지정되는 메모리 영역에 들어간다고 한다.
헌데, 요즘, Spring, iBatis, Hibernate 같은 리플렉션을 이용해서 클래스 메타 정보를 가져다 쓰는 프레임워크들이 많아지면서, MaxPermSize 를 기본값으로 놓고 사용하면 메모리가 부족해지는 현상이 일어나나 보다(나는 아직 겪어보지 못했다).
-XX:PermSize=64m -XX:MaxPermSize=256m
위와 같이 MaxPermSize를 지정하면 된다.
근데, 댓글들을 읽어보면 256m 은 좀 오바인것 같고, OOM 오류가 발생하면 테스트를 해가면서 세팅해야 할 것 같다.
기본 값은 JVM이 -client 옵션의 경우에는 32m -server 옵션일 경우에는 64m 이라고 한다.
또한, MaxPermSize는 -Xmx 로 지정한 메모리 용량과 별도로 할당된다. 즉, -Xmx가 256m 이고, -XX:MaxPermSize가 256m 이라면, 최대 512m이 할당될 수 있다는 것이다.
MaxPermSize and how it relates to the overall heap에 MaxPermSize에 대한 더 자세한 내용이 있다.
JAVA(J2SE 1.4.1) 메모리 영역 구조도 함 읽어보자.
출처 -
http://kwon37xi.egloos.com/2368729
출처 -
http://blog.naver.com/bumsukoh?Redirect=Log&logNo=110125469644
1. 톰캣을 재시작하는 것입니다.
2. 톰캣이 할당할 수 있는 메모리를 늘려줄 수도 있습니다. 이 방법은 에러 발생을 중지시키는 것이 아니라 톰캣을 재시작하기까지의 시간을 연장시킬 뿐입니다.
3. 메모리 누수가 발생하지 않도록 톰캣을 설정합니다.
<param-name>enablePooling</param-name>
<param-value>false</param-value>
</init-param>
다른 옵션에 대해서는 천천히 설명하도록 하겠습니다.
출처 - http://mindasom.tistory.com/96
출처 : http://www.javaservice.net/~java/bbs/read.cgi?b=was&c=r_p&m=appserver&n=1076057072
제목 : MaxPermSize 관련 문제 글쓴이: 최우석(guest) 2004/02/06 17:44:32 조회수:1572 줄수:26 |
안녕하세요. 현재 HP-UX 11.0에서 운영하고 있는 WAS 3.5에서 Permanent generation is full... Increase MaxPermSize (current capacity is set to: 32768K ) 위와 같은 에러가 나고 있습니다. 이런 에러가 나면 서버가 Hang 걸리면서 응답이 없어져서 리스타트를 해야만 합니다. 관련 문서를 찾아보니, jvm parameter를 추가적으로 설정해 줘야한다고 하는군요. (보시다시피 default가 32메가인 것 같습니다.) 그래서 -XX:MaxPermSize=<size>를 추가해주려고 하는데, 얼마나 설정해 줘야할 지 모르겠습니다. ibm 문서를 검색해 봐도 HP 에서 얼마를 설정해줘라하는 문서는 못 찾겠습니다. 도움이 될만한 문서로는, solaris에 WAS 4.0 깔 때 64m로 설정하라는 게 있었고, WPS에서는 128m로 하라는 게 있었구요, Xmx(현재 512m)보다 작아야한다는 것도 있었습니다만, 정확한 guideline은 없더군요. 이럴 때 어떻게 하면 좋을까요? |
제목 : Re: 운영중에 발생한 문제라면.. 글쓴이: 손님(guest) 2004/02/09 11:33:26 조회수:841 줄수:28 |
Perm Size(Permanant Area라고 하던가요?)는 보통 WAS나 JVM이 사용하는 Class들이 사용하는 공간입니다. 보통 WAS를 처음 구동시킬때 위와 같은 에러가 발생하면, Class를 로딩시킬 메모리 공간이 부족하는 의미이며, 이때는 MaxPermSize를 어느정도 크게 잡아서 재 구동시키면 됩니다. 근데, 문제는 위와 같이 운영중인 서버에서 해당 에러를 발생시키고 죽는 경우입니다. 사실 이론적으로는 운영중일때는 위와 같은 에러메시지를 내지 말아야 하지만, 제가 추측하건데.. 다음의 경우에 발생할 수 있는듯 합니다. 첫번째는 해당 WAS의 버그때문에 운영중에 Class를 로딩을 계속 시키는 경우입니다. 모 사이트에서 모 WAS의 버그를 확인한 적이 있습니다. 그때, JSP를 .java 파일로 바꾸고 다시 컴파일하고 Class 로딩하는 WAS의 작업에 버그가 있어서, 특정 JSP에서 변환된 .class 파일이 계속 클래스로딩되었던 적이 있습니다. 이때 개발쪽하고 WAS 업체하고 말이 많았는데, 결국 WAS쪽 버그로 판명 되었습니다. 그리고, 위의 경우가 아니라면, 혹시 서비스 하는 모듈 중에 Class 로딩을 계속 수행하고 있는 것이 있는지 확인해 보십시오. JSP 파일 자체가 계속 수정된다거나.. 인위적으로 특정 Class를 로딩시킨다던가.. 아무튼, 제가 아는 바로는 운영중에 위와같은 에러가 발생한다는것은 MaxPermSize를 아무리 크게 잡아줘도 언젠가는 다시 발생할 수 있다는 것을 말합니다. 저도 이 부분에 대해 확실히 알고 싶은데, 정보가 잘 없더군요. 더 잘 아시는분이 있으시면 좋겠네요. |
출처 - http://bambabo.blog.me/120137349324
|
JVM메모리는 Java Heap space, Permanent Generation 이 존재합니다.
PermGen space는 JVM에서 관리하는 메모리 영역중 하나입니다.
Heap space는 프로그램 실행 도중 생성삭제 되는 Garbage-collected(필요없는경우 제거)입니다.
Permanent는 프로그램이 종료될때 까지 메모리를 차지하는 공간입니다.
Heap은 동적으로 메모리를 사용하게 되며 Permanent는 Class Names, internalized strings, Object등이 들어가며
PermGen도 이곳에 해당합니다.
java.lang.OutOfMemoryError: PermGen space의 해결책은 이클립스 실행시 메모리를 늘려주면 됩니다.
기본은 20M로 설정이 됩니다.
1. eclipse.ini 파일 설정.
javaw -vmargs -Xverify:none -XX:+UseParallelGC -XX:PermSize=64M -XX:MaxPermSize=128M -XX:MaxNewSize=32M -XX:NewSize=32M -Xmx512M
2. eclipse실행 파일.
C:\eclipse\eclipse-jee-ganymede-SR1-win32\eclipse\eclipse.exe -vm "C:\Program Files\Java\jre6\bin\javaw" -vmargs -XX:MaxPermSize=128m -Xms128m -Xmx512m
3. eclipse의 Java VM 옵션 용량 수정.
eclipse 사용시 : Window > Preferences > java > installend JREs > 사용중인 JRE선택 > edit > Default VM Arguments
기본방식
-XX:MaxPermSize=Permanent Generation의 최대용량(기본 용량은 64MB)
변경설정
-XX:MaxPermSize=128m
이클립스에서 잘 돌아가고 있는데 콘솔 창에 심각! 이러면서 java.lang.OutOfMemoryError: PermGen space 에러가 발생하기 시작...기분 나쁜 빨간색과 띄어쓰기로 가지런히 줄지어 있는 에러들...
찾아보니 ..
'Java는 메모리 영역을 사실상 두 부분으로 구분하여 사용한다. 일반 Java Heap space와 클래스와 같이 Permenant Generation 대상 데이터를 두기 위한 PermGen space이다.대부분의 자바 애플리케이션에서는 기본 PermGen Size로 충분하겠지만 이클립스의 경우 클래스가 꽤 많아지면서 모자란 경우가 있는듯 하다"
- http://purehani.egloos.com/1593651
## 원인
Permanent Generation(VM이 데이터를 가지는 곳 중 하나)의 용량 부족.
## 대처
Java VM 기동 옵션에서 용량을 늘려준다.
(Eclipse의 경우는 Window->Preferences->java->installed JREs->사용중인 JRE선택 후 Edit->
Default VM Arguments에서 설정해주면 된다.)
= 기본 방식
= 실제 설정 시 (m은 MB)
위와 같이 설정하도록 하자.
-XX:PermSize (Permanent Generation의 초기용량)을 -XX:MaxPermSize와 같은 용량으로 하는 설정도 있긴하지만 너무 적당적당히 늘려버리면 메모리 할당 균형에 문제가 생기므로 주의하자.
Permanent Generation이 부족한 경우에는 -Xmx의 사이즈도 늘리는게 좋을지도 모름
출처 -
http://netholic.tistory.com/59
요즘 들어 부쩍 java.lang.OutOfMemoryErorr로 인해 이클립스가 뻗어버리는 일이 많이 발생했었다. 하지만 Heap Monitor를 보면 200M 조차 사용하지 않는다. 이런 경우, 대부분은 PermGen 영역이 모자란 것이 원인일 수 있다.
{workspace}/.metadata/.log를 확인해보면 PermGen space라고 기록되어 있을 것이다.
Eclipse를 사용할 때는 JVM에 -Xmx 옵션은 대부분은 넣어서 사용하리라 생각한다. 하지만 Java는 메모리 영역을 사실상 두 부분으로 구분하여 사용한다. 일반 Java Heap space와 클래스와 같이 Permenant Generation 대상 데이터를 두기 위한 PermGen space이다.
대부분의 자바 애플리케이션에서는 기본 PermGen Size로 충분하겠지만 이클립스의 경우 클래스가 꽤 많아지면서 모자란 경우가 있는듯 하다. javanese의 경우 Callisto를 깔아놓고 JDT, CDT를 왔다갔다 하면서 사용하다보니 Heap은 별로 쓰지도 않는데 PermGen space가 종종 모자라는 경우가 있다. 아마 Web관련 Tool을 많이 사용하는 분도 같은 현상이 나타날 수 있을 것이다.
PermGen space는 -XX:MaxPermSize 옵션으로 설정할 수 있다.
eclipse -vm /usr/lib/jvm/java-1.5.0-sun/bin/java -vmargs -XX:MaxPermSize=128m -Xms128m -Xmx512m
OutOfMemory 에러가 발생한다면 -Xmx만 늘려주지말고 PermSize도 확인해보라.
클래스 갯수가 주요원인이기보다는 최근에 framework들이 reflection을 많이 사용해서 더 큰 perm size가 꽤 필요합니다. 이클립스뿐만 아니라, WAS에도 사이즈를 늘려줘야 합니다.
출처 -
http://purehani.egloos.com/1593651
[출처] 이클립스 java.lang.OutOfMemoryError: PermGen space 에러시|작성자 onepromise01==============
'Development > Java' 카테고리의 다른 글
BTrace (0) | 2012.02.02 |
---|---|
jstat 유틸을 이용하면 JVM상태를 상세하게 모니터링 할 수 있다. (0) | 2012.02.02 |
스윙(Swing) (0) | 2012.01.30 |
JCA(Java EE Connector Architecture) (0) | 2012.01.27 |
엔디언(endian) 그리고 UTF-8에서 illegal character: \65279 에러 (0) | 2012.01.27 |