当前位置: 首页 > 编程笔记 >

计算一个Java对象占用字节数的方法

颜经艺
2023-03-14
本文向大家介绍计算一个Java对象占用字节数的方法,包括了计算一个Java对象占用字节数的方法的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了如何计算(或者说,估算)一个Java对象占用的内存数量的方法。分享给大家供大家参考。具体分析如下:

通常,我们谈论的堆内存使用的前提是以“一般情况”为背景的。不包括下面两种情形:
 
某些情况下,JVM根本就没有把Object放入堆中。例如:原则上讲,一个小的thread-local对象存在于栈中,而不是在堆中。
被Object占用内存的大小依赖于Object的当前状态。例如:Object的同步锁是否生效,或者,Object是否正在被回收。
我们先来看看在堆中单个的Object长什么样子

在堆中,每个对象由四个域构成(A、B、C 和 D),下面我们逐个解释一下:
 
A:对象头,占用很少的字节,表述Object当前状态的信息
B:基本类型域占用的空间(原生域指 int、boolean、short等)
C:引用类型域占用的空间(引用类型域指 其他对象的引用,每个引用占用4个字节)
D:填充物占用的空间(后面说明什么是填充物)

下面我们对A、B、C 和 D 逐一解释

A:对象头
内存中,每个对象占用的总空间不仅包含对象内声明的变量所需要的空间,还包括一些额外信息,比如:对象头 和 填充物。“对象头”的作用是用来记录一个对象的实例名字、ID 和 实例状态(例如,当前实例是否“可到达”,或者当前锁的状态等等)。
在当前的JVM版本中(Hotspot),“对象头”占用的字节数如下:
 
一个普通对象,占用8 bytes
数组,占用 12 bytes,包含普通对象的 8 bytes + 4 bytes(数组长度)

B:基本类型
 
boolean、byte 占用 1 byte,char、short 占用 2 bytes,int、float 占用 4 bytes,long、double 占用 8 bytes

C:引用类型
每个引用类型占用 4 bytes

D:填充物
在Hotspot中,每个对象占用的总空间是以8的倍数计算的,对象占用总空间(对象头+声明变量)不足8的倍数时候,自动补齐。而,这些被填充的空间,我们可以称它为“填充物”。我们看下具体实例:
 
一个空对象(没有声明任何变量)占用 8 bytes -- > 对象头 占用 8 bytes
只声明了一个boolean类型变量的类,占用 16 bytes --> 对象头(8 bytes) + boolean (1 bytes) + 填充物(7 bytes)
声明了8个boolean类型html" target="_blank">变量的类,占用 16 bytes --> 对象头(8 bytes) + boolean (1 bytes) * 8

通过上面的实例,更有助于我们加深对Java程序设计的理解。

 类似资料:
  • 本文向大家介绍使用js写一个计算字符串的字节数的方法相关面试题,主要包含被问及使用js写一个计算字符串的字节数的方法时的应答技巧和注意事项,需要的朋友参考一下 const computeLens = (s) => { return s.split('').length } console.log(computeLens('aaacvsa'));

  • 问题内容: 我需要以编程方式确切地找出给定的Java对象正在占用多少内存,包括它所引用的对象所占用的内存。 我可以生成内存堆转储,并使用工具分析结果。但是,生成堆转储以及使用这种工具读取转储以生成报告需要花费大量时间。考虑到我可能需要多次执行此操作,如果我可以在项目中添加一些代码来赋予我“运行时”价值,那么我的工作就会更加敏捷。 我怎样才能最好地做到这一点? ps:具体地说,我有一个javax.x

  • 本文向大家介绍写个方法近似计算指定数组或对象占用内存的大小相关面试题,主要包含被问及写个方法近似计算指定数组或对象占用内存的大小时的应答技巧和注意事项,需要的朋友参考一下 参考文章

  • 本文向大家介绍如何计算Java对象占用了多少空间?,包括了如何计算Java对象占用了多少空间?的使用技巧和注意事项,需要的朋友参考一下 本文介绍了计算Java对象占用了多少空间的方法,分享给大家供大家参考,具体内容如下 一、对象头 对象的头部至少有两个WORD,如果是数组的话,那么三个WORD,内容如下: 1、对象的HashCode,锁信息等 2、到对象类型数据的指针 3、数组的长度(如果是数组的

  • 本文向大家介绍Javascript 计算字符串在localStorage中所占字节数,包括了Javascript 计算字符串在localStorage中所占字节数的使用技巧和注意事项,需要的朋友参考一下 最近项目有个需求要用js计算一串字符串写入到localStorage里所占的内存,众所周知的,js是使用Unicode编码的。而Unicode的实现有N种,其中用的最多的就是UTF-8和UTF-1

  • 问题内容: 我有一个从json_decode创建的stdClass对象,当我运行count($ obj)函数时不会返回正确的数字。该对象具有30个属性,但count()函数的返回值为1。 有任何想法吗? 以下是其中一个对象的示例。(我正在从Twitter请求每日趋势信息)。如果此对象具有多个属性,则count($ obj)等于1。 问题答案: 问题在于count的目的是对数组中的索引进行计数,而不