java中对象占用内存情况

  介绍

本篇文章为大家展示了java中对象占用内存情况,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

java有哪些集合类

java中的集合主要分为四类:1,列清单表:有序的,可重复的;2、队列队列:有序,可重复的;3,设置集合:不可重复;4、地图映射:无序,键唯一,值不唯一。

<强>内存公式

<强>补齐填充:java对象占用空间是8字节对齐的,即所有java对象占用字节数必须是8的倍数

<强>浅大小

对象自身占用的内存大小,不包括它引用的对象。
针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。当然这里面还会包括一些java语言特性的数据存储单元。
针对数组类型的对象,它的大小是数组元素对象的大小总和。

<强>保留大小

保留尺寸=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:一个→B→C, C就是间接引用)
换句话说,保留尺寸就是当前对象被GC后,从堆上总共能释放掉的内存。
不过,释放的时候还要排除被GC根直接或间接引用的对象。他们暂时不会被被当垃圾做。

基本数据类型占用

类型占用空间布尔,byte1byteshort, char2byteint, float4bytelong, double8byte

接下来用JProfiler验证:

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

 public  class  TestObject  {
  }

对象占用内存16 b,如图

癹ava中对象占用内存情况"

<强>结论:一般自建空对象占用内存<强> 16 b 强,16=12(头)+ 4(填充)

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

 public  class  TestObj  {
  ,,,private  int 我;
  
  }

对象占用内存16 b,如图

癹ava中对象占用内存情况"

<强>结论:int占用<强> 4 b 强,16=12(头)+ 4 (int)

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

 public  class  TestObj  {
  ,,,private  long 我;
  
  }

对象占用内存24 b,如图

癹ava中对象占用内存情况"

<强>结论:长占用<强> 8 b 强,24=12(头)+ 8(长)+ 4(填充)

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

包装类型占用

<强>包装类(布尔/字节/短/人物/整数/长/双/浮动)占用内存的大?对象头大小+底层基础数据类型的大小

<强>包装类和其他引用类一样,会产生一个引用(参考)

类型占用空间布尔,Byte16byteShort, Char16byteInteger, Float16byteLong, Double24byte

1。在TestObj中新增一个整数属性,观察对象内存占用

public  class  TestObj  {   ,,private  Integer ,小姐:=128;      }

对象占用内存32 b,如图

癹ava中对象占用内存情况"

<强>结论:整数占用<强> 16 b 强,32=12(头)+ 16(整数)+ 4(参考)

<强>特别的:-128 ~ 127年在常量池,只占用<强> 4 b 强,且不产生引用(参考)

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

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

对象占用内存40 b,如图

癹ava中对象占用内存情况"

<强>结论:长占用24 b ,<强> 40=12(头)+ 24(长)+ 4(参考)

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

基本类型数组占用

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

对象数组本身的大?数组对象头+长度*存放单个元素大小

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

public  class  TestObj  {   ,,private  char [], c =,{& # 39;一个# 39;& # 39;b # 39;, & # 39; c # 39;};      }

char [] c占用内存40 b,如图

java中对象占用内存情况