OutOfMemoeryError |
원인 |
해결 방법 |
GC overhead limit exceeded |
- Java 프로세스의 98% 이상의 시간을 GC 하는데 사용하고, 2% 이하의 Heap 밖에 회복하지 못하며, 이러한 동작이 5회 이상 반복됨.
|
- Heapsize 를 증설함. (Performance 를 항상 고려해야한다)
- -XX:-UseGCOverheadLimit 옵션을 삭제함.
- Application의 Memory Leak 을 고침.
|
java heap space |
- Heap이 가득차거나 공간에 비해 object 가 과도하여 더 이상 Object 를 할당할 수 없음
- Traffic 증가: Traffic 이 증가하면, Memory 사용량도 증가하여 Memory 가 부족해질 수 있음.
- JAVA application 이 Object 를 적절하게 release 하지 못함. object 에 계속 reach 하고 있어서 애플리케이션이 의도하지 않게 객체에 대한 참조를 유지하여 적절하게 GC가 안됨. :
- JAVA application 이 finalizer를 과도하게 사용함(자바 9부턴 deprecated 되었고, Cleaner를 대안으로 지정). 이는 메모리 누수를 유발하거나 애플리케이션의 성능을 저하시킬 수 있음.
|
- Heapsize 를 증설함. (Performance 를 항상 고려해야한다)
- Application 의 Memory Leak 을 고침.
: 애플리케이션이 객체에 대한 참조를 유지하면, 가비지 컬렉션(GC)이 해당 객체를 정리하지 못하고 메모리에 계속 남아 메모리 누수로 이어질 수 있다.
|
Kill process or sacrifice child |
- VM 자체에 메모리가 모자라서 WAS를 실행할 수 없음.
|
|
Metaspace |
- Metasace 영역 부족 (java8 부터 perm → meta 로 변경되고 동작이 달라짐)
|
- MetaSpace 영역을 증설함
- Max 한계를 지정하지 않고, 더 유연하게 JVM을 사용하도록함
- 전체 VM의 Memory를 증설함
- Application Debuging
|
Permgen space |
- Pergem 영역(클래스의 이름, 필드, 메서드 / 클래스와 관련된 객체 배열 및 타입 배열 /
Just In Time 컴파일러 최적화) 부족
|
- Pergem 영역을 증설함
- JVM을 재시작함
- Application 의 class loader 방식을 디버깅함
|
reason stack_trace_with_native_method |
- Native method encountered allocation failure
- a stack trace is printed in which the top frame is a native method
|
- OS 범위에서의 Troubleshooting 이 필요함
|
Requested array size exceeds VM limit |
- Application 이 heap size 보다 큰 Array 를 메모리에 할당하려고 시도함.
|
- Heap size 를 증설함
- 큰 array 를 할당하려는 application 버그를 고침
|
Unable to create new native thread |
- 새로운 Thread 를 만들기에 Memory 에 충분한 공간이 없음.
|
- VM 메모리를 증설하거나 정리함
- JAVA HeapSize 를 줄임.
- OS 차원에서 더 많은 Thread 를 실행할 수 있도록 limit 을 증설함 (ulimit -amax user processes)
- Thread stack size(-Xss) 를 줄임.
|