기본 콘텐츠로 건너뛰기

Simple Java Heap & Gabage Collection

Java heap management

자바의 메모리 관리는 garbage collection의 효율성을 높이기 위해 존재한다.
자바의 특징 중 하나는 JVM이 자동으로 메모리 관리를 하는 것이다.
정확히 말하자면 메모리 해제만을 자동으로 한다. 그리고 이 기능을 garbage collection이라고 한다.

Fig 1. Layer of heap
그림 1에서 볼 수 있듯이, heap 메모리 영역은 EdenTenured로 크게 2 영역으로 나눠진다.

Eden

Eden은 자유영역 정도로 볼 수 있다. Object의 생성/소멸이 자유롭게 또는 빈번하게 이뤄지는 영역이라는 뜻으로 볼 수 있다.

Tenured

Tenured는 종신 영역이라 번역할 수 있는데, object가 이곳에 들어가면 빠져 나올 수 없다고 이해하는 것이 쉽다. 실제로 이런 이름이 어울리는 이유는 생성/소멸의 빈도에 따라 object의 위치를 바꾸기 때문이다.

Fig 2. Heap에서의 object 이동
그림2를 보면 heap 에서의 object의 이동을 원리를 알 수 있다.

Minor GC(=Young GC)

  • Eden 영역에 "new" 연산자에 의해 Object가 생성된다.
  1. 설정된 비율 이상의 객체가 Eden에 할당된다.
  2. Eden+From Space(S0)에서 Minor GC(소규모 객체 해제, Young GC라고도 한다.)가 일어난다.
  3. 객체 중 참조(reference)가 없는 객체는 메모리 해제시킨다.
  4. 객체 중 참조가 남은 메모리는 To Space(S1)으로 보낸다.

  1. 설정된 비율 이상의 객체가 Eden에 할당된다.
  2. Eden+From Space(S1)에서 Minor GC(소규모 객체 해제, Young GC라고도 한다.)가 일어난다.
  3. 객체 중 참조(reference)가 없는 객체는 메모리 해제시킨다.
  4. 객체 중 참조가 남은 메모리는 From Space(S0)으로 보낸다.

  1. 1~4가 반복된다.
  2. 다음의 2가지 경우일 때, 해당 객체는 Tenured로 보내진다.
  • To(S1)/From(S0) Space의 메모리 공간이 부족할 경우
  • 설정된 횟수(기본 32) 이상 GC되지 않고, S1과 S0로 반복적으로 옮겨다닌 객체일 경우

Major GC(=Old GC)

설정된 비율이상으로 Tenured 영역이 채워지면 Old GC를 통해 메모리를 해제시킨다.

Full GC

Tenured 영역이 가득 찰 경우, JVM은 다른 모든 동작을 멈추고 Gabage Collection만 수행한다.
이 때, 서버의 기능은 수초간 멈추게 된다. Full GC가 있었다는 것은 메모리 중 해제되지 않는 객체가 있다는 것이다. 즉, 메모리 누수(Memory Leak)을 의심해 볼 수 있다.

Permanent Area

Permanent Area는 Class를 Loading하는데 사용한다.
개발 환경에서 편의상 사용하는 Hot Deploy는 Permanent Area 로 Class가 Loading하면서 기존의 Loading 되어있던 클래스를 Unloading하는 것이다. IDE의 디버깅 모드를 생각하면 되겠다.(Permanent Area 의 경우 GC 라 하지않고 Unloading 이라 부른다.)

주의)

  • 수시로 Hot Deploy 가 일어나서 Permanent Area 가 Full 나게되면 Full GC 가 일어나게 된다.
  • Loading 해야될 Class 보다 적은 Permanent Size 를 할당할 경우, Full GC 도 수시로 일어나지만 OOME(Out Of Memory Error)가 발생하며 서버가 중단될 수도 있다.


댓글

이 블로그의 인기 게시물

AWS ELB 504 Error

AWS EC2  운영 중 가끔씩 볼 수 있는 에러가 있습니다. 대표적으로 다음의 세가지 502, 503, 504 입니다. 이 중에서 이번에 알아볼 문제는 HTTP 504 에러입니다 .  타임 아웃이 되어   Request 를 처리하지 못하는 상황이 됩니다 .   해결 방법부터 이야기 하자면 다음과 같이 웹서버의 Time-out 시간을 60 초 이상으로 늘리는 것입니다 . Web Server & Application Time-out >= 60 sec 그 이유는 다음과 같은 ELB의 특성 때문입니다. ELB는 클라이언트와 EC2 서버 양쪽으로 커넥션을 유지하고 있습니다. ELB는 클라이언트와  EC2 서버간의 커넥션을 관리하는 역할을 맡고 있습니다. 그래서 유효한 커넥션만을 남겨놓습니다. 이를 위해서 Time-out 시간을 가지고 이 시간동안 데이터가 송수신되지 않으면 연결을 끊습니다.  기본적으로 Elastic Load Balancing는 두 연결 모두에 대해 Time-out(유휴 시간) 시간을 60초로 되어 있습니다. 그렇기 때문에 HTTP 또는 HTTPS를 사용할 경우 "KeppAlive" 옵션을 사용하여 커넥션을 재활용해야 합니다. 이 때  ELB 커넥션도 재사용되기 때문에 CPU 사용률을 줄일 수 있습니다. Browser Time-out Opera 11.11 120 sec IE 9 60 sec Chrome 13 300 sec FireFox 4 115 sec 서버 로직 중에서 60초 이상 실행될 수 있는 부분이 있는 경우 504 에러를 자주 볼 수 있을 것입니다. 문제 해결을 위해서는 Web Server는 물론  Tomcat 설정 또한 60초 이상으로 변경해주어야 합니다. ...

Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase vs Membase vs Neo4j comparison

번역 작업 원문 NoSQL DB 비교 분석 자료 MongoDB 구현 : C++ 특징 : 몇가지 SQL과 비슷한 속성을 가짐(Query, index 등) 라이센스 : AGPL 프로토콜 : Custom, binary(BSON) 특징 Master/slave replication(auto failover with replica sets) Sharding built-in Queries are javascript expressions Run arbitrary javascript functions server-side Better update-in-place than CouchDB Uses memory mapped files for data storage Performance over features Journaling (with --journal) is best turned on On 32bit system, limited to 2.5Gb An empty database takes up 192Mb GridFS to store big data + metadata (not actually an FS) Has geospatial indexing 주요 사용처 만약 다양한 쿼리가 필요하다면 map/reduce 함수가 아니라 인텍스를 선호한다면 big DB에서 좋은 성능을 바란다면  CouchDB를 사용하길 원하지만, filling up disks에 너무 많은 데이터 변화가 있다면 사용예 For most things that you would do with MySQL or PostgreSQL, but having predefined columns really holds you back. CouchDB 구현 :  Erlang 주요특징 : DB consistency, 쉬운 사용 라이센스 : Apache 프로토콜 : HTTP/REST 상세특징 Bi-directional r...

Cron expression

초 0-59 , - * / 분 0-59 , - * / 시 0-23 , - * / 일 1-31 , - * ? / L W 월 1-12 or JAN-DEC , - * / 요일 1-7 or SUN-SAT , - * ? / L # 년(옵션) 1970-2099 , - * / * 모든 값 ? 특정 값 없음 - 범위 지정에 사용 , 여러 값 지정 구분에 사용 / 초기값과 증가치 설정에 사용 L 지정할 수 있는 범위의 마지막 값 W 월~금요일 또는 가장 가까운 월/금요일 # 몇 번째 무슨 요일 2#1 => 첫 번째 월요일 예제) Expression Meaning 초분시일월주(년) "0 0 12 * * ?" 아무 요일, 매월, 매일 12:00:00 "0 15 10 ? * *" 모든 요일, 매월, 아무 날이나 10:15:00 "0 15 10 * * ?" 아무 요일, 매월, 매일 10:15:00 "0 15 10 * * ? *" 모든 연도, 아무 요일, 매월, 매일 10:15 "0 15 10 * * ? 2005" 2005년 아무 요일이나 매월, 매일 10:15 "0 * 14 * * ?" 아무 요일, 매월, 매일, 14시 매분 0초 "0 0/5 14 * * ?" 아무 요일, 매월, 매일, 14시 매 5분마다 0초 "0 0/5 14,18 * * ?" 아무 요일, 매월, 매일, 14시, 18시 매 5분마다 0초 "0 0-5 14 * * ?" 아무 요일, 매월, 매일, 14:00 부터 매 14:05까지 매 분 0초 "0 10,44 14 ? 3 WED" 3월의 매 주 수요일, 아무 날짜나 14:10:00, 14:44:00 "0 15 10 ? * MON-FRI" 월~금, 매월, 아무 날이나 10:15:00 "0 15 10 15 * ?...