programing

Java의 부울 프리미티브 크기가 정의되지 않은 이유는 무엇입니까?

javaba 2022. 9. 3. 23:53
반응형

Java의 부울 프리미티브 크기가 정의되지 않은 이유는 무엇입니까?

Java 가상 시스템 규격에서는 부울 프리미티브 유형에 대한 지원이 제한적이라고 합니다.

부울 값에 대한 작업 전용 Java 가상 시스템 명령은 없습니다.대신 부울 값으로 작동하는 Java 프로그래밍 언어의 식이 Java 가상 시스템 데이터 유형의 값을 사용하도록 컴파일됩니다.

위의 내용은 (잘못 해석했을 수도 있지만) int 데이터 타입이 boulan에서 동작할 때 사용되지만 이것은 32비트 메모리 구성입니다.부울이 1비트의 정보만을 나타내는 경우:

  • 바이트 또는 짧은 유형이 int 대신 부울 프록시로 사용되지 않는 이유는 무엇입니까?
  • 주어진 JVM에 대해 부울 유형을 저장하는 데 사용되는 메모리 양을 정확하게 파악하는 가장 신뢰할 수 있는 방법은 무엇입니까?

간단한 답변: 예, 부울 값은 32비트 엔티티로 조작되지만 부울 배열은 요소당 1바이트를 사용합니다.

긴 답변: JVM은 로컬 변수, 메서드 인수 및 식 값을 유지하는 데 사용되는 32비트 스택셀을 사용합니다.1셀보다 작은 프리미티브는 패딩 처리되고 32비트보다 큰 프리미티브는 2셀을 사용합니다.이 기술은 opcode 수를 최소화하지만 몇 가지 특이한 부작용(바이트 마스크 필요성 등)이 있습니다.

어레이에 저장된 프리미티브는 32비트 미만을 사용할 수 있으며 어레이에서 프리미티브 값을 로드하고 저장하기 위한 다양한 opcode가 있습니다.부울값과 바이트값 모두baload그리고.bastoreopcodes. 이는 부울 배열이 요소당 1바이트를 차지함을 의미합니다.

인메모리 오브젝트 레이아웃에 관한 한, 이것은 「프라이빗 실장」규칙으로 취급되고 있습니다.1비트, 1바이트, 또는 다른 포스터에 기재되어 있듯이 64비트의 이중 워드 경계에 맞추어 정렬할 수 있습니다.대부분의 경우 기본 하드웨어의 기본 워드 크기(32비트 또는 64비트)가 필요합니다.


부울란이 사용하는 공간을 최소화하는 한 대부분의 애플리케이션에서 문제가 되지 않습니다.스택 프레임(로컬 변수 및 메서드 인수를 유지하는 것)은 그다지 크지 않습니다.또한 빅 스킴에서는 오브젝트의 이산 부울도 그다지 크지 않습니다.부울이 많은 객체가 있는 경우 getter 및 setter를 통해 관리되는 비트필드를 사용할 수 있습니다.단, CPU 시간은 메모리 내의 패널티보다 클 수 있습니다.

상속 계층 내 어딘가에 있는 단일 부울은 최대 8바이트를 사용할 수 있습니다.패딩이 원인입니다.자세한 내용은 Java 객체가 사용하는 메모리 용량:

부울이 소비하는 양이 어느 정도인지에 대한 질문으로 돌아가면 최소 1바이트를 소비하지만 정렬 규칙 때문에 훨씬 더 많이 소비할 수 있습니다.IMHO는 부울[]이 1비트가 아닌 엔트리당1바이트를 소비한다는 것과 어레이의 크기 필드에 대한 얼라인먼트로 인한 오버헤드를 알 수 있는 것이 더 흥미롭습니다.큰 비트 필드가 유용한 그래프 알고리즘이 있습니다.부울[]을 사용하는 경우 실제 필요한 것보다 거의 8배 많은 메모리가 필요합니다(1바이트 대 1비트).

Java in a Nutshell(O'Reilly) 5판에서는 부울 프리미티브 타입이 1바이트라고 합니다.이는 힙의 검사 결과에 따라 잘못된 것일 수 있습니다.대부분의 JVM이 변수를 1바이트 미만으로 할당하는 데 문제가 있는지 궁금합니다.

부울 매핑은 32비트 CPU를 염두에 두고 수행되었습니다.int 값은 32비트이므로 한 번의 작업으로 처리할 수 있습니다.

크기를 측정하기 위한 Peter Norvig의 Java IAQ: 자주 대답하지 않는 질문(일부 부정확함)의 솔루션을 다음에 제시합니다.

static Runtime runtime = Runtime.getRuntime();
...
long start, end;
Object obj;
runtime.gc();
start = runtime.freememory();
obj = new Object(); // Or whatever you want to look at
end =  runtime.freememory();
System.out.println("That took " + (start-end) + " bytes.");

CPU는 특정 데이터형 길이로 동작합니다.32비트 CPU의 경우 길이가 32비트이므로 Java에서는 'int'라고 부릅니다.CPU가 처리하려면 이 길이로 채우거나 분할해야 합니다.이 작업은 시간이 많이 걸리지 않지만 기본 작업에 1이 아닌 2개의 CPU 사이클이 필요한 경우 비용/시간이 2배가 됩니다.

이 사양은 32비트 CPU 전용으로 네이티브 데이터 타입을 사용하여 부울을 처리할 수 있도록 합니다.

여기에는 속도 또는 메모리 중 하나만 사용할 수 있습니다. SUN은 속도에 따라 결정됩니다.

부울 데이터형의 정확한 크기를 알 수 없습니다.가상 시스템에 따라 다르거나 운영 체제에 따라 다릅니다.

다음과 같은 .java 파일을 하나 만들면 어떨까요?

Empty.java

class Empty{
}

그리고 이런 수업도 있습니다.

Not Empty.java

class NotEmpty{
   boolean b;
}

둘 다 컴파일하여 .class 파일을 16진수 에디터와 비교합니다.

언급URL : https://stackoverflow.com/questions/1907318/why-is-javas-boolean-primitive-size-not-defined

반응형