java中的 boolean 在内存中占多少字节?

mfdate 2007-11-28 11:05:19
java中的 boolean 在内存中占多少字节?
...全文
54043 57 打赏 收藏 转发到动态 举报
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
monkey007 2012-06-13
  • 打赏
  • 举报
回复
今天做实验遇到这个问题了,5万×5万的boolean[][],JDK7的JVM内存上限设置1000MB,很快占满并java.lang.OutOfMemoryError: Java heap space
说明一个boolean变量实际占用1Byte
a363722188 2012-06-10
  • 打赏
  • 举报
回复
我觉得它占多少跟计算机内存给他分配多少是两回事 它占一位 就是1bit 而给它分配内存的时候给他分配1个字节 意思还有7位他是空着的
qwer24739 2012-06-09
  • 打赏
  • 举报
回复
即使一个位能够解决 但是 由于 JAVA和c++中计算的最小单位是BYTE
所以true在内存中表示为 0x00000001
所以 还是一个 BYTE 即一个字节
不争聊技术 2011-08-22
  • 打赏
  • 举报
回复


'before' heap: 552656, 'after' heap: 2152320
heap delta: 1599664, {class java.lang.Boolean} size = 16 bytes

不争聊技术 2011-08-22
  • 打赏
  • 举报
回复
package com.base;
public class Sizeof
{
public static void main (String [] args) throws Exception
{
// Warm up all classes/methods we will use
runGC ();
usedMemory ();
// Array to keep strong references to allocated objects
final int count = 100000;

Object [] objects = new Object [count];

long heap1 = 0;

// Allocate count+1 objects, discard the first one
for (int i = -1; i < count; ++ i)
{
Object object = null;
// Instantiate your data here and assign it to object
// object = new Object ();
// object = new Integer (i);
object = new Boolean(true);
//object = new Long (i);
//object = new String ();
//object = new byte [128][1]
if (i >= 0)
objects [i] = object;
else
{
object = null; // Discard the warm up object
runGC ();
heap1 = usedMemory (); // Take a before heap snapshot
}
}
runGC ();
long heap2 = usedMemory (); // Take an after heap snapshot:

final int size = Math.round (((float)(heap2 - heap1))/count);
System.out.println ("'before' heap: " + heap1 +
", 'after' heap: " + heap2);
System.out.println ("heap delta: " + (heap2 - heap1) +
", {" + objects [0].getClass () + "} size = " + size + " bytes");
for (int i = 0; i < count; ++ i) objects [i] = null;
objects = null;
}
private static void runGC () throws Exception
{
// It helps to call Runtime.gc()
// using several method calls:
for (int r = 0; r < 4; ++ r) _runGC ();
}
private static void _runGC () throws Exception
{
long usedMem1 = usedMemory (), usedMem2 = Long.MAX_VALUE;

for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++ i)
{
s_runtime.runFinalization ();
s_runtime.gc ();
Thread.currentThread().yield ();
usedMem2 = usedMem1;
usedMem1 = usedMemory ();
}
}
private static long usedMemory ()
{
return s_runtime.totalMemory ()- s_runtime.freeMemory ();
}
private static final Runtime s_runtime = Runtime.getRuntime ();
} // End of class


方志 2011-05-13
  • 打赏
  • 举报
回复
boolean尽管只需一位表示,但实际应该是占一个byte。
自己建立一个大的boolean数组,然后观察内存值可以得到结论.
lenovo_E520 2011-03-03
  • 打赏
  • 举报
回复
boolean: The boolean data type has only two possiblevalues: true and false.
zings 2010-01-20
  • 打赏
  • 举报
回复
这个问题要mark下。。。
云上飞翔 2008-04-18
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 steedhorse 的回复:]
内存中占多大并不重要,反正它只有两个值。
但在大多数JVM实现中,应该是一个字节。
[/Quote]
答:应该是一个字节。不要只是“猜”。看看28楼,既然是讨论,就要有依据。当然不在乎
几个字节也无所谓。本来题目就是一个乐一乐的题目而已。
晨星 2008-04-18
  • 打赏
  • 举报
回复
内存中占多大并不重要,反正它只有两个值。
但在大多数JVM实现中,应该是一个字节。
云上飞翔 2008-04-18
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 arieshyde 的回复:]
引用 15 楼 java2000_net 的回复:
即使一个bit 就能用,但可惜,最小的内存寻址单元就是byte,所以占用一个byte.

正解
[/Quote]
答:你应先认真读一读《The JavaTM Virtual Machine Specification(Second Edition)》中“3.3.4 The boolean Type”这一节,再回答是不是“正解”。
黑格东东斯基 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 java2000_net 的回复:]
即使一个bit 就能用,但可惜,最小的内存寻址单元就是byte,所以占用一个byte.
[/Quote]
正解
云上飞翔 2008-04-17
  • 打赏
  • 举报
回复
答:综上所述,马士兵同志的视频中的讲法是有问题的。
云上飞翔 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 mfdate 的帖子:]
java中的 boolean 在内存中占多少字节?
[/Quote]
答:我的结论是:
1)boolean a=true;//这个a在JVM中占4个字节即:32位。
2)boolean[] b = new boolean[10];//数组时,每一个boolean在JVM中占一个字节
理由:
1)JAVA规范中没有定义boolean类型的大小
2)但是:在JVM规范第2版中讲得十分清楚。我上边的结论就是从它当中取出来的。
根据:(JVM规范第2版 3.3.4节)
Instead, expressions in the Java programming language that operate on boolean values are compiled to use values of the Java virtual machine int data type.
Where Java programming language boolean values are mapped by compilers to values of Java virtual machine type int, the compilers must use the same encoding. 而:Java virtual machine type int, whose values are 32-bit signed two's-complement integers。
Arrays of type boolean are accessed and modified using the byte array instructions
In Sun's JDK releases 1.0 and 1.1, and the Java 2 SDK, Standard Edition, v1.2, boolean arrays in the Java programming language are encoded as Java virtual machine byte arrays, using 8 bits per boolean element.

li.jianfei 2008-04-17
  • 打赏
  • 举报
回复
寡人可以确定的告诉你
1个字节
anqini 2008-04-17
  • 打赏
  • 举报
回复
1字节,8位!
beaster111 2008-04-17
  • 打赏
  • 举报
回复
vc++是四个字节,不是一个bit
Boolean variable (should be TRUE or FALSE).
This type is declared in WinDef.h as follows:
typedef int BOOL;
hmsuccess 2008-03-08
  • 打赏
  • 举报
回复
在c++中,布尔值只占用一个字节的内存空间,由于布尔类型只有两个不同的值,布尔类型的变量只需要占用比一个字节更小的内存,编译程序可以把8个布尔变量的值压缩在一个字节里
Pol 2008-03-08
  • 打赏
  • 举报
回复
自己所学知识觉得是一位了.
jlabel 2008-03-08
  • 打赏
  • 举报
回复
严重关注一下.
加载更多回复(37)

62,636

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧