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

조회수 2025회

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

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

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
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)