0Pricing
Java Academy · 강의

MemorySegment와 Arena

힙 외부 메모리를 할당합니다

MemorySegment와 Arena은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

오프힙 메모리

FFM은 두 가지 핵심 유형으로 네이티브 오프힙 메모리를 모델링합니다. MemorySegment는 연속된 메모리 영역을 나타내고, Arena는 그 수명을 제어합니다.

이 둘을 함께 사용하면 과거에 안전하지 않은 방식으로 수동 관리하던 버퍼를 대체할 수 있습니다.

MemorySegment란 무엇인가

MemorySegment는 메모리 블록을 바라보는 타입이 지정된 창입니다. 크기와 수명을 알고 있으며 모든 접근에 경계 검사가 적용됩니다.

세그먼트는 오프힙(네이티브) 메모리를 사용할 수도 있고 온힙 배열을 감쌀 수도 있습니다.

Arena란 무엇인가

Arena는 세그먼트를 할당하고 세그먼트가 해제되는 시점을 정합니다. 아레나가 닫히면 모든 세그먼트가 한 번의 결정적인 단계에서 무효화됩니다.

  • Arena.ofConfined(): 단일 스레드, 명시적 닫기
  • Arena.ofShared(): 다중 스레드 접근
  • Arena.global(): 절대 해제되지 않음
  • Arena.ofAuto(): 가비지 컬렉터가 해제

세그먼트 할당

리소스 자동 관리 구문에서 사용하는 제한된 아레나가 일반적인 패턴입니다. 바이트를 할당하고 사용하면 닫을 때 모든 메모리가 해제됩니다.

import java.lang.foreign.*;

public class Main {
    public static void main(String[] args) {
        try (Arena arena = Arena.ofConfined()) {
            MemorySegment seg = arena.allocate(16);
            System.out.println("Allocated bytes: " + seg.byteSize());
        }
        System.out.println("Arena closed, memory freed");
    }
}

쓰기와 읽기

ValueLayout과 오프셋을 받는 타입별 접근자를 통해 값을 읽고 씁니다. 이렇게 하면 접근 시 타입 안전성과 정렬이 유지됩니다.

import java.lang.foreign.*;

public class Main {
    public static void main(String[] args) {
        try (Arena arena = Arena.ofConfined()) {
            MemorySegment seg = arena.allocate(ValueLayout.JAVA_INT);
            seg.set(ValueLayout.JAVA_INT, 0, 42);
            int value = seg.get(ValueLayout.JAVA_INT, 0);
            System.out.println("Stored and read: " + value);
        }
    }
}

타입이 지정된 슬롯 할당

원시 바이트 수를 지정하는 대신 레이아웃을 기준으로 할당할 수 있습니다. arena.allocate(JAVA_INT)는 정수 하나에 필요한 만큼의 바이트를 정확히, 올바르게 정렬된 상태로 예약합니다.

따라서 크기를 수동으로 계산할 필요가 없습니다.

값 배열

여러 요소를 저장하려면 시퀀스 레이아웃을 할당하거나 개수를 전달합니다. 인덱스 접근에서는 요소 크기를 기준으로 계산한 오프셋을 사용합니다.

import java.lang.foreign.*;

public class Main {
    public static void main(String[] args) {
        try (Arena arena = Arena.ofConfined()) {
            MemorySegment ints = arena.allocate(ValueLayout.JAVA_INT, 5);
            for (int i = 0; i < 5; i++) {
                ints.setAtIndex(ValueLayout.JAVA_INT, i, i * 10);
            }
            System.out.println("Element 3: " + ints.getAtIndex(ValueLayout.JAVA_INT, 3));
        }
    }
}

경계 검사

세그먼트의 범위를 벗어나 읽거나 쓰면 IndexOutOfBoundsException이 발생합니다. 아레나가 닫힌 뒤 세그먼트에 접근하면 IllegalStateException이 발생합니다.

이러한 검사 덕분에 JNI와 달리 FFM의 메모리는 안전하게 관리됩니다.

격리

제한된 아레나는 세그먼트를 생성한 스레드에 결속합니다. 다른 스레드가 세그먼트에 접근하면 WrongThreadException이 발생합니다.

실제로 공유해야 하는 메모리에는 Arena.ofShared()를 사용하세요. 이 방식은 약간의 비용으로 다중 스레드 접근을 허용합니다.

문자열 다루기

FFM은 Java 문자열과 C 문자열을 연결하는 도우미를 제공합니다. allocateUtf8String(최신 방식은 allocateFrom)은 널 종료 문자열을 작성하고, getUtf8String은 문자열을 다시 읽습니다.

import java.lang.foreign.*;

public class Main {
    public static void main(String[] args) {
        try (Arena arena = Arena.ofConfined()) {
            MemorySegment cString = arena.allocateUtf8String("hello");
            System.out.println("Read back: " + cString.getUtf8String(0));
        }
    }
}

아레나 선택

지침은 다음과 같습니다.

  • 수명이 짧고 단일 스레드에서 사용하는 버퍼: ofConfined()
  • 스레드 간 공유: ofShared()
  • 가비지 컬렉터가 수명을 관리: ofAuto()
  • 프로세스 전체에서 사용하는 상수: global()

빠른 확인

네이티브 메모리가 해제되는 시점을 무엇이 결정하는지 떠올려 보세요.

복습

오프힙 메모리 관리 방법을 배웠습니다.

  • MemorySegment: 경계 검사가 적용된 메모리 영역
  • Arena: 수명 제어(제한, 공유, 자동, 전역)
  • ValueLayout과 get/set, getAtIndex를 통한 타입별 접근
  • 경계 검사와 격리를 통한 안전성

다음으로는 하향 호출 핸들을 사용해 네이티브 함수를 호출합니다.

자주 묻는 질문

“MemorySegment와 Arena” 강의는 무료인가요?

네 — “MemorySegment와 Arena” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“MemorySegment와 Arena”에서 뭘 배우나요?

힙 외부 메모리를 할당합니다 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Java Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“MemorySegment와 Arena” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. JNI보다 FFM을 사용하는 이유
  2. MemorySegment와 Arena
  3. 다운콜 핸들
  4. 레이아웃과 구조체
← Java Academy(으)로 돌아가기