본문 바로가기

Java

Memory leak 문제 해결

문제



TOP가 메모리를 3GB까지 잡아먹는 괴물이 되고, 프로세스가 뻗어버리는 문제


  [ TOP Heap 메모리 캡쳐 화면 ]




VisualVM



 JDK에 설치된 메모리 분석 도구 ( TOP가 사용하는 JDK의 bin에 있음 )





Heap memory 관리가 어떻게 됨?



 메모리 분석을 하기전에, JVM이 메모리 관리를 어떻게 하는지도 모르는데 무엇을 하겠는가.



  Heap memory 관리 이해하기

 

 JVM은 OS로부터 java heap memory를 할당하고  자바 어플래케이션을 위한 heap을 관리한다. 어플리케이션이 새로운 object를 만들 때, JVM은 이것을 저장하기 위해 heap memory의 인접 영역에 하위 할당한다.  다른 객체에 의해 참조되고 있는 힙에 있는 객체 , 계속 참조되고 있으면 힙에 남아있는다. 더이상 참조되지 않는 객체들은 쓰레기이고 힙에서 할당된 영역을 해지한다. JVM은 이러한 객체를 제거하기 위해 GC를 실행하고, 힙에 남아있는 객체들을 재 정리한다.


전통적인 HotSpot JVM 알고리즘은 힙을 "young"과 "old"로 나눈다. 대부분의 객체를 young generation에 만들고 해당 영역 GC에서 제거되지 않은 객체들을 old generation으로 옮긴다. old generation은 자주 일어나지는 않지만, collection이 일어나는 동안 JVM thread들이 멈춘다면 애플리캐이션 성능에는 훨씬 큰 영향을 끼친다.


JVM heap은 초기 Heap 크기 ( -Xms )와 최대 Heap 크기 ( -Xmx )설정을 통해 현재 heap 크기를 다양하게 설정할 수 있다.  그러나 운영체제는 이것이 사용하는 메모리를 Heap에 lazily하게 commit하기 때문에 이는 다양한 메모리 지표 결과를 만든다.


 Working Set은 Heap에 살아있는 객체들의 총량을 나타낸다. JVM의 관점에서 Used Memory는 Working Set과 Garabage이고 Free Memory는 (현재 Heap 크기 - Used Memory) 이다.


 만약, -Xmx < -Xmx 이고 Used Memory와 현재 힙 크키가 같으면, JVM은 full gc를 한 후에 힙을 키운다. 그러나 -Xms와 -Xmx가 같다면 힙은 더이상 커지지 않는다.


 자바 프로세스는 자바 class와 같은 덜 다니아믹한 객체(?)를 사용하기 위한 PermGen 영역과 같은 non-heap 메모리 영역을 필요로 한다. OS와 다른 어플리캐이션 프로세스들도 메모리를 사용한다. VM에서 사용되는 모든 non-heap 메모리는 다른 범주에 속한다. VM의 vRAM 설정보다 설정된 힙과 다른 메모리 사용량의 합이 더 크게 되면, 운영체제는 page swapping을 사용한다. 이는 성능을 저하시키기 때문에, VM 사이즈를 잘 잡는것이 중요하다.






응답없음이 되는 이유?







사용하는 Heap에 비해 Heap Size가 너무 큰거 아닌가?



 

'Java' 카테고리의 다른 글

JAVA File I/O에 관하여  (0) 2017.11.28
#java.util.ConcurrentModificationException 이슈  (0) 2017.10.30
ClassNotFoundException ( 클래스 로더 정리 )  (0) 2017.09.14
export Jar  (0) 2017.08.21
Interface를 이용하여 Callback 구현하기  (0) 2017.06.03