555 words
3 minutes
[Java]off-heap
2025-07-28
2026-01-09

Overview#

Java의 off-heap 메모리를 간단히 정리한다.

01. off-heap 메모리#


Concept

  • on-heap : 자바에서 생성된 객체는 기본적으로 heap Memory에 저장된다. 이는 JVM이 자동으로 관리하며, GC를 통해 자동으로 메모리가 회수된다.
  • off-heap : 간단히는 JVM의 힙 메모리 외부에 있는 메모리 영역에 직접 접근해서 GC의 영향을 받지 않고 메모리를 관리하는 것을 의미. java에서는nio의 Direct ByteBuffer를 통해 off-heap 메모리를 사용할 수 있다. 객체가 기본적으로 직렬화되어 JVM외부 메모리에 할당되고 어플리케이션에 의해 관리된다.

02 off-heap 메모리 사용이유#

java의 on-heap 메모리의 경우 GC의 대상이기 때문에 용량이 큰 객체를 heap에 할당하거나 객체가 엄청 많아질 경우 Full GC가 자주 발생하게 된다. 이 경우 GC가 전체 힙 메모리를 스캔하고, 불필요한 객체를 제거하는 과정에서 급격한. 성능 저하가 발생할 수 있다. 특히 장시간 유지되어야 하는 버퍼나 캐시 데이터를 heap에 둘 경우 GC로 인한 pause가 길어진다. 반면 off-heap 메모리는 GC의 영향을 받지 않기 때문에 대용량 데이터 처리시 안정적인 성능을 유지할 수 있다.

03. off-heap 메모리 흐름#

java 예제 1

package io;
import java.nio.ByteBuffer;
public class MemoryDemo {
public static void main(String[] args) {
// on heap allocation
int[] heapArray = new int[1024]; // allocated on java heap
heapArray[0] = 42;
System.out.println("Heap Value: " + heapArray[0]);
// modern off heap allocation
ByteBuffer buffer = ByteBuffer.allocateDirect(4096);
buffer.putInt(0, 42);
int value = buffer.getInt(0);
System.out.println("Off Heap value: " + value);
}
}

java off heap 사용 메모리 할당 예제

package io;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.PooledByteBufAllocator;
public class OffHeapAvoidFullGc {
public static void main(String[] args) {
int size = 50;
int totalBytes = size * 1024 * 1024 // mb
// 01. allocate off heap
ByteBuf buffer = PooledByteBufAllocator.DEFAULT.directBuffer(totalBytes);
// 02. 고정문자열로 데이터 채우기
try {
byte[] content = "BIG_DATA".getBytes(StandardCharsets.UTF_8);
for (i = 0; i < totalBytes/content.length; i++) {
buffer.writeBytes(content);
}
// 03. 읽기포인터 초기화, 일부 확인
buffer.setIndex(0, buffer.writerIndex())
byte[] preview = new byte[20];
buffer.readBytes(preview);
System.out.println("sample data :" + new String(preview));
} finally {
buffer.release();
}
}
}

Reference#

[[java-iostream]]

[Java]off-heap
https://yjinheon.netlify.app/posts/01programming/java/java-off_heap/
Author
Datamind
Published at
2025-07-28
License
CC BY-NC-SA 4.0