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

mfdate 2007-11-28 11:05:19
java中的 boolean 在内存中占多少字节?
...全文
53866 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.ianfei 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)
​ 博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌项目名称基于Web的酒店客房管理系统的设计与实现系统说明3.2.1  用户模块功能分析前台模块应主要包括用户登录模块、用户注册模块、查看客房信息模块、客房预定 模块、用户留言模块、充值模块和个人信息维护模块。用户登录模块:用户通过输入注册的的账号和密码,然后进行身份验证,匹配成功 后实现登录功能。用户注册模块:用户输入合法的账号和密码可以实现注册功能。 查看客房信息模块:用户可以通过首页查看客房的价格,图片,详情等信息,从而   可以选择想要预定的房间。 客房预定模块:用户选择自己想要预定的客房后,可以通过输入相关信息进行订房操作。用户留言模块:用户可以向管理员发送留言。 充值模块:用户可以通过添加银行卡再为自己进行充值操作。 个人信息维护模块:用户可以修改自己的姓名、密码、身份证号等信息,还可以查看自己的订单。3.2.2  管理员模块功能分析对于管理员而言,一个好的管理系统总是能让酒店的管理工作事半功倍[7]。管理员 能够通过这个系统对自己的酒店情况一目了然,应该包括客户留言模块、客房管理模 块、订房信息管理模块、入住信息管理模块、统计分析模块、酒店新闻管理模块、会 员信息管理模块、员工信息管理模块、系统用户管理模块、个人信息维护模块。客户留言模块:管理员可以查看并回复用户的留言。客房管理模块:管理员可以管理客房信息,可以添加新的客房,删除已经停用的客房信息,还可以修改现有的客房信息。订房信息管理模块:管理员可以处理用户的订房请求,为用户办理入住手续。入住信息管理模块:对于没有注册的线下客户,也可以办理入住手续。统计分析模块:可以对酒店所有的入住信息进行记录和总结分析。酒店新闻管理模块:管理员可以更新网站上的新闻公告,展示图片等信息。会员信息管理模块:管理员可以查看到所有的注册会员信息,可以对会员信息进行删除,修改,添加操作。员工信息管理模块:管理员可以查看到自己公司所有的员工信息,而且还可以对员工的相关信息进行管理。系统用户管理模块:管理员可以查看到所有的系统管理员信息并对管理员信息进行管理。个人信息维护模块:管理员可以更改自己的登录密码或者是姓名、性别、手机号等 相关个人信息。​编辑 环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本;6.是否Maven项目:否;技术栈1. 后端:Spring+SpringMVC+Mybatis2. 前端:JSP+CSS+JavaScript+jQuery使用说明1. 使用Navicat或者其它工具,在mysql创建对应名称的数据库,并导入项目的sql文件;2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;3. 将项目springmvc-servlet.xml配置文件的数据库配置改为自己的配置;4. 运行项目,在浏览器输入http://localhost:8080/ 登录运行截图​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑 用户管理控制层:package com.houserss.controller;import javax.servlet.http.HttpSession;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import com.houserss.common.Const;import com.houserss.common.Const.Role;import com.houserss.common.ServerResponse;import com.houserss.pojo.User;import com.houserss.service.IUserService;import com.houserss.service.impl.UserServiceImpl;import com.houserss.util.MD5Util;import com.houserss.util.TimeUtils;import com.houserss.vo.DeleteHouseVo;import com.houserss.vo.PageInfoVo;/** * Created by admin */@Controller@RequestMapping(/user/)public class UserController if (ip != null && ip.length() > 0) String[] ips = ip.split(,);for (int i = 0; i  

62,614

社区成员

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

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