자바에서 객체의 사이즈를 결정하는 가장 좋은 방법은 무엇인가요?


예를 들어, 데이터가 행으로 구분되어 저장된 CSV 파일을 읽을 수 있는 애플리케이션이 있습니다. 데이터 타입에 기반하여 행의 개수를 요약해서 사용자에게 제공하고자 합니다. 그러나 OutOfMemoryError가 발생되어 많은 행의 데이터를 읽을 수가 없습니다. 각 행은 하나의 객체로 변환합니다. 프로그래밍으로 객체의 크기를 알아낼 수 있는 쉬운 방법이 있나요? VM에서 프리미티브 타입과 레퍼런스 타입이 크기를 결정하는 기준이 있나요?

32000 행 정도 읽는 소스코드는 만들었습니다. 그러나 메모리의 32MB 정도 사용할 때까지 해당 행 데이터를 읽을 수 있도록 만들고 싶습니다. 이것은 앞의 질문과 조금 다른데요. 이것도 알고 싶습니다.

  • 2016년 05월 27일에 작성됨

조회수 112


1 답변


좋아요
0
싫어요
채택취소하기

java.lang.instrument package를 사용하시면 됩니다.

아래의 클래스를 컴파일해서 JAR 안에 넣으세요:

import java.lang.instrument.Instrumentation;

public class ObjectSizeFetcher {
    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long getObjectSize(Object o) {
        return instrumentation.getObjectSize(o);
    }
}

그리고 MANIFEST.MF에 아래의 내용을 추가하세요.

Premain-Class: ObjectSizeFetcher

getObjectSize를 사용하세요:

public class C {
    private int x;
    private int y;

    public static void main(String [] args) {
        System.out.println(ObjectSizeFetcher.getObjectSize(new C()));
    }
}

그리고 다음과 같이 실행하세요:

java -javaagent:ObjectSizeFetcherAgent.jar C
  • 2016년 05월 28일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close