返回顶部
首页 > 资讯 > 后端开发 > Python >java boolean占用内存大小说明
  • 705
分享到

java boolean占用内存大小说明

2024-04-02 19:04:59 705人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

答案:4B或1B 详细 1、如果boolean是单独使用:boolean占4个字节。 2、如果boolean是以boolean数组形式使用:boolean占1个字节 解释 1、JVM

答案:4B或1B

详细

1、如果boolean是单独使用:boolean占4个字节。

2、如果boolean是以boolean数组形式使用:boolean占1个字节

解释

1、JVM没有提供boolean类型专用的字节指令,而是使用int相关指令来代替。

2、对boolean数组的访问与修改,会共用byte数组的baload和bastore指令。

分析结论

上面的第一个结论是说:boolean在底层实际调用int,那么既然int占4个字节,boolean页自然占4个字节。即 boolean类型占4个字节。

上面的第2个结论是说:boolean数组在底层会用byte指令,那么既然byte占1个字节,boolean数组中的boolean也就占1个字节,即,boolean数组中的boolean占1个字节。

扩展

1、因此,大多数对于boolean,byte,char和short类型数据的操作,实际都提升int,并使用int做为运算类型,所以他们占4个字节,实际上,虚拟机规范也只有4字节和8字节类型(long,float),boolean,char,short都是占了4字节。

2、对于在栈上(局部变量)的byte,char,short类型的数据,在内存中的确会占4字节,但这对于(数组)对象来说并不适用。

java各种类型对象占用内存情况分析

经典篇,有图有真相

为什么写这篇文章?

其实一般的程序猿根本不用了解这么深,只有当你到了一定层次,需要了解jvm内部运行机制,或者高并发多线程下,你写的代码对内存有影响,你想做性能优化。。。等等等等,一句话,当你想深入了解java对象在内存中,如何存储,或者每个对象占用多大空间时,你会感谢这篇文章

本文主要分析jvm中的情况,实验环境为64位window10系统、jdk1.8,使用JProfiler进行结论验证

很多描述以及 概念是基于你懂基本java知识的,如果你看起来有点吃力,要加油咯

基本数据类型占用

类型 占用空间
boolean、byte 1byte
short、char 2byte
int、float 4byte
long、double 8byte

接下来用JProfiler验证:

新建一个空对象,观察空对象内存占用


public class TestObject {
}

对象占用内存 16b,如图

在这里插入图片描述

结论:一般自建空对象占用内存 16b,16 = 12 + 4

在TestObj中新增一个 int 属性,观察对象内存占用


public class TestObj {
    private int i;
}

对象占用内存 16b,如图

在这里插入图片描述

结论:int 占用 4b, 4 = 16 -12

在TestObj中新增一个 long 属性,观察对象内存占用


public class TestObj {
    private long i;
}

对象占用内存 24b,如图

在这里插入图片描述

结论:long 占用 8b, 8 = 24 -12 - 4

其余基本类型可以参照以上自行验证,原理一样

包装类型占用

包装类(Boolean/Byte/Short/Character/Integer/Long/Double/Float)占用内存的大小等于对象头大小加上底层基础数据类型的大小。

类型占用空间Boolean、Byte16byteShort、Char16byteInteger、Float16byteLong、Double24byte 在TestObj中新增一个 Integer 属性,观察对象内存占用

类型 占用空间
Boolean、Byte 16byte
Short、Char 16byte
Integer、Float 16byte
Long、Double 24byte

public class TestObj {
   private Integer  i =128;
}

对象占用内存 32b,如图

在这里插入图片描述

结论:Integer 占用 16b, 16 = 32 - 16

特别的:-128~127 之间的封装类型,只占用 4b**

在TestObj中新增一个 Long 属性,观察对象内存占用


public class TestObj {
   private Long  l = new Long(1);
}

对象占用内存 40b,如图

在这里插入图片描述

结论:Long 占用 24b, 16 = 40 - 16

其余包装类型可以参照以上自行验证,原理一样

基本类型数组占用

64位机器上,数组对象的对象头占用24 bytes,启用压缩后占用16字节。比普通对象占用内存多是因为需要额外的空间存储数组的长度(普通16b-12b)。

对象数组本身的大小=数组对象头 + length * 存放单个元素大小

在TestObj中新增一个 char[] 属性,观察对象内存占用


public class TestObj {
   private char[] c = {'a','b','c'};
}

对象占用内存 40b,如图

在这里插入图片描述

结论:char[3] 占用 24b, 24 = 40 - 16,24 = 16 + 3 * 2 + 2

封装类型数组占用

封装类型数组比基本类型的数组,需要多管理元素的引用

对象数组本身的大小=数组对象头+length 引用指针大小 + length 存放单个元素大小

在TestObj中新增一个 Integer[] 属性,观察对象内存占用


public class TestObj {
    private Integer[] i = {128,129,130};
}

对象占用内存 80b,如图

在这里插入图片描述

结论:Integer[3] 占用 80b, 80 = 96 - 16 , 80 = 16 + 3 4 + 3 16 +4

String占用内存 在TestObj中新增一个空 String 属性,观察对象内存占用


public class TestObj {
    private String s = new String("");
}

对象占用内存 40b,如图

在这里插入图片描述

结论:String 本身占用 24b, 24 = 40 -16,另外,String的属性value还需要 16b,也就是说空””也需要16b

注意:这里为什么要写String s = new String(“”)?请自己思考,不写会怎么样?

答:如果写成String s = “”,是不会再堆中开辟内存的,也就看不到String占用的空间,你看到的将会是下面的,至于为什么,都是因为final

在这里插入图片描述

ArrayList, HashMap的内存占用

这些参考文章开头提到的那篇文章,下面给出计算公式:

一个ArrayList实例本身的的大小为

12(header) + 4(modCount) + 4(size) + 4(elementData reference) = 24 (bytes)

下面分析一个只有一个Integer(1)元素的ArrayList实例占用的内存大小。


ArrayList<Integer> testList = Lists.newArrayList();
testList.add(1);

根据上面对ArrayList原理的介绍,当调用add方法时,ArrayList会初始化一个默认大小为10的数组,而数组中

保存的Integer(1)实例大小为16 bytes。

则testList占用的内存大小为:

24(ArrayList itselft) + 16(elementData array header) + 10 * 4(elemetData reference) + 16(Integer) = 96 (bytes)

JProfiler中的结果验证了上述分析:

在这里插入图片描述

2. HashMap内存占用

这里分析一个只有一组键值对的HashMap, 结构如下:


Map<Integer, Integer> testMap = Maps.newHashMap();
testMap.put(1, 2);

首先分析HashMap本身的大小。HashMap对象拥有的属性包括:



  transient node<K,V>[] table;
 
  
  transient Set<Map.Entry<K,V>> entrySet;
 
  
  transient int size;
 
  
  transient int modCount;
 
  
  // (The javadoc description is true upon serialization.
  // Additionally, if the table array has not been allocated, this
  // field holds the initial array capacity, or zero signifying
  // DEFAULT_INITIAL_CAPACITY.)
  int threshold;
 
  
  final float loadFactor;

HashMap继承了AbstractMap<K,V>, AbstractMap有两个属性:


transient Set<K>        keySet;
 transient Collection<V> values;

所以一个HashMap对象本身的大小为:

12(header) + 4(table reference) + 4(entrySet reference) + 4(size) + 4(modCount) + 4(threshold) + 8(loadFactor) + 4(keySet reference) + 4(values reference) = 48(bytes)

接着分析testMap实例在总共占用的内存大小。

根据上面对HashMap原理的介绍,可知每对键值对对应一个Node对象。根据上面的Node的数据结构,一个Node对象的大小为:

12(header) + 4(hash reference) + 4(key reference) + 4(value reference)+ 4(next pointer reference) = 28 (padding) -> 32(bytes)

加上Key和Value两个Integer对象,一个Node占用内存总大小为:32 + 2 * 16 = 64(bytes)

JProfiler中结果:

在这里插入图片描述

下面分析HashMap的Node数组的大小。

根据上面HashMap的原理可知,在不指定容量大小的情况下,HashMap初始容量为16,所以testMap的Node[]占用的内存大小为:

16(header) + 16 * 4(Node reference) + 64(Node) = 144(bytes)

JProfile结果:

clipboard.png

所以,testMap占用的内存总大小为:

48(map itself) + 144(Node[]) = 192(bytes)

JProfile结果:

在这里插入图片描述

这里只用一个例子说明如何对HashMap进行占用内存大小的计算,根据HashMap初始化容量的大小,以及扩容的影响,HashMap占用内存大小要进行具体分析,不过思路都是一致的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: java boolean占用内存大小说明

本文链接: https://lsjlt.com/news/127545.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java boolean占用内存大小说明
    答案:4B或1B 详细 1、如果boolean是单独使用:boolean占4个字节。 2、如果boolean是以boolean数组形式使用:boolean占1个字节 解释 1、JVM...
    99+
    2024-04-02
  • linux怎么查看redis占用内存大小
    要查看Redis占用的内存大小,可以使用以下方法:1. 登录到Redis服务器。2. 执行`redis-cli`命令,启动Redis...
    99+
    2023-09-01
    redis linux
  • Android中一张图片占用的内存大小
    最近面试过程中发现对Android中一些知识有些模棱两可,之前总是看别人的总结,自己没去实践过,这两天对个别问题进行专门研究 探讨:如何计算An...
    99+
    2022-06-06
    图片 Android
  • ubuntu怎么查询程序占用的内存大小
    ubuntu查询程序占用内存大小的方法:使用快捷键Ctrl+Alt+t打开终端。输入以下命令即可查到相关信息,命令如下://方法一#ps aux 返回的结果中VSZ(或VSS)列表示程序占用了多少虚拟内存,RSS列表示程序占用了多少物理内存...
    99+
    2024-04-02
  • MySQL占用内存过大如何解决
    这篇文章主要介绍“MySQL占用内存过大如何解决”,在日常操作中,相信很多人在MySQL占用内存过大如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL占用内存过...
    99+
    2024-04-02
  • tomcat内存占用太大如何排查
    要排查Tomcat内存占用过大的问题,可以采取以下步骤:1. 查看Tomcat的日志文件,尤其是catalina.out文件,以了解...
    99+
    2023-09-12
    tomcat
  • mongodb内存占用太大怎么解决
    可以通过以下几种方式来解决MongoDB内存占用过大的问题: 调整wiredTiger引擎的缓存大小:MongoDB使用wire...
    99+
    2023-10-25
    mongodb
  • sqlserver.exe一直占用cpu和内存很大
    如果sqlserver.exe一直占用CPU和内存很大,可能有以下几个原因和解决方法:1. 查询或操作过多:检查是否有过多的查询或操...
    99+
    2023-08-08
    sqlserver.exe
  • java中对象占用内存情况
    本篇文章为大家展示了java中对象占用内存情况,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queue队列:...
    99+
    2023-06-14
  • linux怎么查看java内存占用
    要查看Java进程的内存占用情况,可以使用以下命令:1. 使用top命令查看进程的内存占用情况:```top -p ```在top命...
    99+
    2023-09-09
    java linux
  • java内存占用高如何清理
    在Java中,内存占用高可能是因为程序中存在内存泄漏或者使用了大量的不必要的对象。以下是一些清理内存的方法: 使用垃圾回收器:J...
    99+
    2024-03-02
    java
  • java怎么设置堆内存大小
    在Java中,可以使用`-Xmx`参数来设置堆内存的大小。`-Xmx`参数后面跟着要分配的内存大小,单位可以是M(兆字节)或G(千兆...
    99+
    2023-09-27
    java
  • redis设置最大占用内存的方法
    这篇文章给大家分享的是有关redis设置最大占用内存的方法的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。设置方法:Redis设置占用物理机最大的内存#占用最大20G maxmem...
    99+
    2024-04-02
  • 设置Redis最大占用内存的实现
    目录打开redis配置文件我们可以在CentOS下输入命令:find / -name redis查找redis目录:Redis使用超过设置的最大值使用info命令查看Redis内存使...
    99+
    2024-04-02
  • Linux/Centos查看进程占用内存大小的几种方法总结
    1.命令行输入top回车,然后按下大写M按照memory排序,按下大写P按照CPU排序。2. ps -ef | grep "进程名"    ps -e -o 'pid,comm,args,pcpu,rsz,vsz,sti...
    99+
    2023-06-06
  • java怎么限制内存频率大小
    在Java中,可以使用以下方法来限制内存频率大小: 使用命令行参数:可以使用-Xmx参数来指定Java程序的最大堆内存大小。例如...
    99+
    2024-02-29
    java
  • 怎么在redis中设置最大占用内存
    在redis中设置最大占用内存的方法:1.启动redis服务;2.登录redis数据库;3.使用maxmemory语句设置;具体步骤如下:首先,在命令行中启动redis服务;service redis start mysql服务启动后,输入...
    99+
    2024-04-02
  • Python读取大文件的"坑“与内存占用
    python读写文件的api都很简单,一不留神就容易踩”坑“。笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码。 1.read()与readlines(): 随手搜索pyt...
    99+
    2023-01-30
    大文件 内存 Python
  • 别再说APP占内存了?五款工具多内存小的APP推荐给你,还不快看看
    作为一个资深的手机迷,你们有没有注意到自己的手机上究竟下载了多少APP,我想至少上百个,而其中你可能一个月都用不上的APP至少占了一大半。...
    99+
    2023-06-05
  • java应用占用内存过高如何解决
    java应用占用内存过高如何解决?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作