programing tip

Java에 sizeof-like 메소드가 있습니까?

itbloger 2020. 10. 30. 07:46
반응형

Java에 sizeof-like 메소드가 있습니까?


모든 데이터 유형의 크기를 찾기 위해 Java에 내장 된 메소드가 있습니까? 크기를 찾는 방법이 있습니까?


아니오. 표준 Java SE 클래스 라이브러리에는 이러한 메소드가 없습니다.

디자이너의 견해는 Java에서는 필요하지 않다는 것입니다. 언어는 응용 프로그램 1 이 기본 값, 객체 또는 주어진 요소 수를 가진 배열에 대해 예약해야하는 공간을 알 필요가 없기 때문입니다 .

sizeof 연산자는 데이터 구조가 차지하는 공간을 알아야하는 사람들에게 유용하다고 생각할 수 있습니다. 그러나 Java 메모리 프로파일 러를 사용하면이 정보를 비롯한 더 많은 정보를 간단하고 안정적으로 얻을 수 있으므로 sizeof 메서드가 필요하지 않습니다.


이전 덧글는 점 만들어 sizeof(someType)보다 더 읽을 것을 4. 가독성 주장을 받아 들인다면 해결책은 당신의 손에 달려 있습니다. 간단히 다음과 같은 클래스를 정의하십시오.

public class PrimitiveSizes {
    public static int sizeof(byte b) { return 1; } 
    public static int sizeof(short s) { return 2; }
    // etcetera
}

... 정적으로 가져 오기 ...

import static PrimitiveSizes.*;

또는 명명 된 상수를 정의하십시오. 예 :

public static final int SIZE_OF_INT = 4;

또는 (Java 8 이상) Integer.BYTES상수를 사용하는 식 입니다.


Java 디자이너가 표준 라이브러리에서이를 구현하지 않은 이유는 무엇입니까? 내 생각 엔 :

  • 그들은 그것을 필요로하지 않는다고 생각합니다.
  • 충분한 수요가 있다고 생각하지 않고
  • 그들은 노력할 가치가 없다고 생각합니다.

sizeof(Object o)기술적 인 어려움이 있는 방법에 대한 다음 수요가있을 것이라는 문제도 있습니다 .

위의 핵심 단어는 "they"입니다!

당신이나 내가 그것에 대해 어떻게 생각하는지는 중요하지 않습니다. 그리고 더 나아가 댓글에서이 주제에 대해 토론하는 것은 논쟁의 여지가 있습니다. 제발, 그러지 마세요.


1-프로그래머는 공간 효율적인 데이터 구조를 설계하기 위해 알아야 할 수도 있습니다. 그러나 메서드 호출을 통해 런타임에 응용 프로그램 코드에 해당 정보가 필요한 이유를 상상할 수 없습니다.


JavaWorld기사에서

피상적 인 대답은 Java가 C의 sizeof ()와 같은 것을 제공하지 않는다는 것입니다. 그러나 Java 프로그래머가 때때로 원하는 이유를 고려해 보겠습니다.

AC 프로그래머는 대부분의 데이터 구조 메모리 할당을 직접 관리하며 sizeof ()는 할당 할 메모리 블록 크기를 아는 데 없어서는 안될 필수 요소입니다. 또한 malloc ()과 같은 C 메모리 할당자는 객체 초기화에 관한 한 거의 아무것도하지 않습니다. 프로그래머는 추가 객체에 대한 포인터 인 모든 객체 필드를 설정해야합니다. 그러나 모든 것을 말하고 코딩하면 C / C ++ 메모리 할당이 매우 효율적입니다.

이에 비해 Java 객체 할당과 구성은 함께 연결되어 있습니다 (할당되었지만 초기화되지 않은 객체 인스턴스를 사용하는 것은 불가능합니다). Java 클래스가 추가 객체에 대한 참조 인 필드를 정의하는 경우 생성시 설정하는 것도 일반적입니다. 따라서 Java 객체를 할당하면 상호 연결된 수많은 객체 인스턴스 인 객체 그래프가 자주 할당됩니다. 자동 가비지 콜렉션과 결합하면이 모든 것이 너무 편리하며 Java 메모리 할당 세부 사항에 대해 걱정할 필요가 없다고 느낄 수 있습니다.

물론 이것은 단순한 Java 애플리케이션에서만 작동합니다. C / C ++와 비교하여 동등한 Java 데이터 구조는 더 많은 물리적 메모리를 차지하는 경향이 있습니다. 엔터프라이즈 소프트웨어 개발에서 오늘날의 32 비트 JVM에서 사용 가능한 최대 가상 메모리에 근접하는 것은 일반적인 확장 성 제약입니다. 따라서 Java 프로그래머는 sizeof () 또는 이와 유사한 것을 통해 데이터 구조가 너무 커지거나 메모리 병목 현상이 있는지 여부를 주시 할 수 있습니다. 다행히 Java 리플렉션을 사용하면 이러한 도구를 매우 쉽게 작성할 수 있습니다.

계속하기 전에이 기사의 질문에 대해 자주 있지만 잘못된 답변을 생략하겠습니다. 오류 : Java 기본 유형의 크기가 고정되어 있으므로 Sizeof ()가 필요하지 않습니다.

예, Java int는 모든 JVM 및 모든 플랫폼에서 32 비트이지만 이는 프로그래머가 인식 할 수있는이 데이터 유형의 너비에 대한 언어 사양 요구 사항 일뿐입니다. 이러한 int는 본질적으로 추상적 인 데이터 유형이며 64 비트 머신의 64 비트 물리적 메모리 단어로 백업 할 수 있습니다. 원시 유형이 아닌 경우에도 마찬가지입니다. Java 언어 사양은 클래스 필드가 물리적 메모리에서 정렬되어야하는 방법 또는 부울 배열이 JVM 내에서 컴팩트 비트 벡터로 구현 될 수 없다는 내용에 대해 언급하지 않습니다. 오류 : 객체를 바이트 스트림으로 직렬화하고 결과 스트림 길이를 확인하여 객체의 크기를 측정 할 수 있습니다.

이것이 작동하지 않는 이유는 직렬화 레이아웃이 실제 메모리 내 레이아웃을 원격으로 반영하기 때문입니다. 이를 확인하는 한 가지 쉬운 방법은 문자열이 직렬화되는 방법을 보는 것입니다. 메모리에서 모든 문자는 최소 2 바이트이지만 직렬화 된 형식에서는 문자열이 UTF-8로 인코딩되므로 모든 ASCII 콘텐츠는 절반의 공간을 차지합니다.


자바 기본 액세스 라이브러리는 일반적으로 자바에서 기본 공유 라이브러리를 호출하는 데 사용됩니다. 이 라이브러리에는 Java 객체의 크기를 결정하는 방법이 있습니다.

getNativeSize(Class cls)방법과 그 오버로드 대부분의 클래스의 크기를 제공 할 것입니다.

또는 클래스가 JNA의 Structure 클래스에서 상속하는 경우 calculateSize(boolean force)메서드를 사용할 수 있습니다.


여기 에서 언급했듯이 래퍼를 통해 기본 유형의 크기를 가져올 수있는 가능성이 있습니다.

예를 들어 long이것은 Long.SIZE / Byte.SIZEjava 1.5 ( 이미 zeodtr 에서 언급했듯이 ) 또는 Long.BYTESjava 8에서 일 수 있습니다.


프리미티브의 크기를 얻기 위해 아래와 같은 비트 조작을 할 수 있습니다.

public int sizeofInt() {
    int i = 1, j = 0;
    while (i != 0) {
        i = (i<<1); j++;
    }
    return j;
}

public int sizeofChar() {
    char i = 1, j = 0;
    while (i != 0) {
        i = (char) (i<<1); j++;
    }
    return j;
}

Java 1.5의 기본 유형에 대해 Integer.SIZE / 8, Double.SIZE / 8 등을 사용할 수 있습니다.


원시인을위한 현대적인 방법이 있습니다. BYTES유형 사용 .

System.out.println("byte " + Byte.BYTES);
System.out.println("char " + Character.BYTES);
System.out.println("int " + Integer.BYTES);
System.out.println("long " + Long.BYTES);
System.out.println("short " + Short.BYTES);
System.out.println("double " + Double.BYTES);
System.out.println("float " + Float.BYTES);

그 결과,

byte 1
char 2
int 4
long 8
short 2
double 8
float 4

Instrumentation 클래스에는 getObjectSize () 메서드가 있지만 런타임에 사용할 필요는 없습니다. 메모리 사용량을 검사하는 가장 쉬운 방법은 메모리 사용량을 추적 할 수 있도록 설계된 프로파일 러를 사용하는 것입니다.


I decided to create an enum without following the standard Java conventions. Perhaps you like this.

public enum sizeof {
    ;
    public static final int FLOAT = Float.SIZE / 8;
    public static final int INTEGER = Integer.SIZE / 8;
    public static final int DOUBLE = Double.SIZE / 8;
}

Try java.lang.Instrumentation.getObjectSize(Object). But please be aware that

It returns an implementation-specific approximation of the amount of storage consumed by the specified object. The result may include some or all of the object's overhead, and thus is useful for comparison within an implementation but not between implementations. The estimate may change during a single invocation of the JVM.


EhCache provides a SizeOf class that will try to use the Instrumentation agent and will fall back to a different approach if the agent is not loaded or cannot be loaded (details here).

Also see the agent from Heinz Kabutz.


There's a class/jar available on SourceForge.net that uses Java instrumentation to calculate the size of any object. Here's a link to the description: java.sizeOf


I don't think it is in the java API. but most datatypes which have a number of elements in it, have a size() method. I think you can easily write a function to check for size yourself?

참고URL : https://stackoverflow.com/questions/2370288/is-there-any-sizeof-like-method-in-java

반응형