JVM on-heap v.s. off-heap

Minseop Jeong·2022년 7월 2일
0

Java 프로그램은 JVM 위에서 동작하며, JVM 의 Garbage Collector가 프로그램이 사용하는 메모리 관리도 수행한다. Java 프로그램이 생성한 object는 JVM의 Heap 영역에 생성되며, 더이상 reachable 하지 않은 object는 GC의 대상이 된다.

on-heap memory

일반적으로 생각하는 Heap 영역이 on-heap memory이다. Java 프로그램에서 생성한 object가 저장되는 곳이다. Garbage Collector가 메모리를 관리하기에 C/C++ 과는 다르게 할당받은 메모리를 헤재하는 수고가 줄어들며, memory leak 걱정을 하지 않아도 된다.

GC(특히 major or full GC) 동작시 unreachable object들의 memory 해제를 진행하는데 이 과정에서 애플리케이션이 멈추는 현상(Stop the world)이 발생하고 이는 애플리케이션의 성능 저하로 이어진다.

많은, 사이즈가 큰 객체를 생성하고, 실시간에 가까운 데이터 처리를 필요로 하는 빅데이터 플랫폼에서는 full GC로 인한 애플리케이션 성능 저하가 치명적일 수 있다. 이런 경우 off-heap memory 사용이 필요할 수도 있다. JVM GC 알고리즘이 스마트 하지만, 애플리케이션 레벨에서 불필요한 GC를 줄이는 것이다.

off-heap memory

on-heap과는 반대로 heap 밖에 저장한다는 의미로, GC의 대상으로 삼지 않겠다는 뜻이다. DirectByteBuffer를 이용해 할당받은 공간은 GC의 대상이 되지 않는다. 하지만 이 경우 memory leak을 방지하기 위해 애플리케이션에서 GC가 하던 메모리 allocation/deallocation을 직접해줘야 한다. 따라서 라이브러리에서 메모리 관리를 해주는 EHCache, Terrcotta BigMemory 같은 off-heap 메모리 라이브러리를 사용한다.

Object는 seriealized 되어 RAM에 저장된다. Serialize 과정이 추가되기 때문에 on-heap store 보다 조금 느리다고 할 수 있다.

Reference

profile
Data Engineer

0개의 댓글