[java] Java에서 부울 변수의 크기는 얼마입니까?
누구든지 Java에서 부울 의 비트 크기를 알 수 있습니까 ?
답변
가상 머신에 따라 다릅니다.
답변
가상 머신에 따라 다르지만 Java의 바이트에 대해 묻는 유사한 질문 의 코드를 쉽게 수정할 수 있습니다 .
class LotsOfBooleans
{
boolean a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af;
boolean b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf;
boolean c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf;
boolean d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df;
boolean e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef;
}
class LotsOfInts
{
int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af;
int b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf;
int c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf;
int d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df;
int e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef;
}
public class Test
{
private static final int SIZE = 1000000;
public static void main(String[] args) throws Exception
{
LotsOfBooleans[] first = new LotsOfBooleans[SIZE];
LotsOfInts[] second = new LotsOfInts[SIZE];
System.gc();
long startMem = getMemory();
for (int i=0; i < SIZE; i++)
{
first[i] = new LotsOfBooleans();
}
System.gc();
long endMem = getMemory();
System.out.println ("Size for LotsOfBooleans: " + (endMem-startMem));
System.out.println ("Average size: " + ((endMem-startMem) / ((double)SIZE)));
System.gc();
startMem = getMemory();
for (int i=0; i < SIZE; i++)
{
second[i] = new LotsOfInts();
}
System.gc();
endMem = getMemory();
System.out.println ("Size for LotsOfInts: " + (endMem-startMem));
System.out.println ("Average size: " + ((endMem-startMem) / ((double)SIZE)));
// Make sure nothing gets collected
long total = 0;
for (int i=0; i < SIZE; i++)
{
total += (first[i].a0 ? 1 : 0) + second[i].a0;
}
System.out.println(total);
}
private static long getMemory()
{
Runtime runtime = Runtime.getRuntime();
return runtime.totalMemory() - runtime.freeMemory();
}
}
다시 말하면 이것은 VM에 따라 다르지만 Sun의 JDK 빌드 1.6.0_11을 실행하는 Windows 랩톱에서 다음과 같은 결과를 얻었습니다.
Size for LotsOfBooleans: 87978576
Average size: 87.978576
Size for LotsOfInts: 328000000
Average size: 328.0
이는 부울이 기본적으로 Sun의 JVM에 의해 각각 바이트로 압축 될 수 있음을 의미합니다.
답변
Java에서 부울 값으로 표시되는 실제 정보는 1 비트입니다. 1은 true, 0은 false입니다. 그러나 메모리에있는 부울 변수의 실제 크기는 Java 사양에 의해 정확하게 정의되지 않습니다. Java의 기본 데이터 유형을 참조하십시오 .
부울 데이터 유형에는 true 및 false의 두 가지 가능한 값만 있습니다. 참 / 거짓 조건을 추적하는 간단한 플래그에이 데이터 유형을 사용하십시오. 이 데이터 유형은 정보의 1 비트를 나타내지 만 “크기”는 정확하게 정의 된 것이 아닙니다.
답변
참고로 …
Boolean 객체 배열을 사용할 생각이라면 사용하지 마십시오. 대신 BitSet을 사용하십시오-성능 최적화가 가능합니다 (그리고 다음 설정 / 설정 해제 비트를 얻을 수있는 몇 가지 멋진 추가 방법).
답변
Java는 boolean
데이터 유형에 대해 1 바이트를 예약 하지만 1 비트 만 사용 한다고 읽었습니다 . 그러나 문서에 따르면 “크기”는 정확하게 정의 된 것이 아닙니다 .
여길 봐.
답변
boolean
값으로 컴파일 int
JVM의 데이터 유형. 를 참조하십시오 여기 .
답변
Java의 부울 크기는 가상 머신에 따라 다릅니다. 그러나 모든 Java 객체는 8 바이트 단위로 정렬됩니다. 부울에는 총 9 바이트의 정보에 대해 8 바이트의 헤더와 1 바이트의 페이로드가 있습니다. JVM은 다음 8의 배수로 반올림하여 java.lang.Boolean의 한 인스턴스가 16 바이트의 메모리를 차지합니다.