(一)java内存占用计算基础

内存管理系列基础:能精确计算内存占用,才可以定量判一个模块的内存使用情况是否符合预期

Posted by chchaooo on February 11, 2018

基本类型占用的内存

Java基本类型占用的字节数:(1字节(byte)=8位(bits))

  • 1字节: byte , boolean
  • 2字节: short , char
  • 4字节: int , float
  • 8字节: long , double

对象内存的存储方式及所占用内存大小计算

通常,我们谈论的堆内存使用的前提是以“一般情况”为背景的。不包括下面两种情形:

  • 某些情况下,JVM根本就没有把Object放入堆中。例如:原则上讲,一个小的thread-local对象存在于栈中,而不是在堆中。
  • 被Object占用内存的大小依赖于Object的当前状态。例如:Object的同步锁是否生效,或者,Object是否正在被回收。

我们先来看看在堆中单个的Object长什么样子

在堆中,每个对象由多个域构成,下面我们逐个解释一下:

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

对象头“对象头”的作用是用来记录一个对象的实例名字、ID 和 实例状态(例如,当前实例是否“可到达”,或者当前锁的状态等等)。 在当前的JVM版本中(Hotspot),一个普通对象,占用8bytes(64位系统为8bytes)

OOP:Ordinary Object Point,普通对象指针,指向该对象对应类在方法区中的类信息实例。

数组长度:4个字节(bytes)

基本类型

  • 1字节: byte , boolean
  • 2字节: short , char
  • 4字节: int , float
  • 8字节: long , double

HotSpot创建的对象的字段会先按照给定顺序排列一下,默认的顺序如下,从长到短排列,引用排最后:
long/double –> int/float –> short/char –> byte/boolean –> Reference

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

填充物:在Hotspot中,每个对象占用的总空间是以8的倍数计算的,对象占用总空间(对象头+声明变量)不足8的倍数时候,自动补齐。而,这些被填充的空间,我们可以称它为“填充物”。我们看下具体实例:

  • 一个空对象(没有声明任何变量)占用 16bytes – > 对象头 (8bytes) + OOP(4bytes) + padding(4bytes)
  • 只声明了一个boolean类型变量的类,占用 16bytes –> 对象头(8bytes) + OOP(4bytes) + boolean (1bytes) + padding(7bytes)
  • 声明了4个boolean类型变量的类,占用 16bytes –> 对象头(8bytes) + OOP(4bytes) + boolean (4bytes)

Compressed oops(压缩了的普通对象指针)

参考:https://www.2cto.com/kf/201611/560958.html