java对象内存计算工具

java-sizeof

作用:计算java对象内存占用情况

1
2
3
4
5
<dependency>
<groupId>com.carrotsearch</groupId>
<artifactId>java-sizeof</artifactId>
<version>0.0.5</version>
</dependency>

如:计算object占用多少内存空间

1
2
Object object = new Object();
System.out.println(com.carrotsearch.sizeof.RamUsageEstimator.humanSizeOf(object));

openjdk-jol

作用:java object layout(java对象布局 查看工具)

1
2
3
4
5
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.10</version>
</dependency>

如:查看object内存布局及占用情况

1
2
3
4
5
6
7
8
9
@Test
public void test3(){
User user = new User();
user.setId(1);
int hascode = user.hashCode();
System.out.println(hascode);
System.out.println(Integer.toBinaryString(hascode));
System.out.println(org.openjdk.jol.info.ClassLayout.parseInstance(user).toPrintable());
}

输出x信息

1
2
3
4
5
6
7
8
9
10
11
12
1837543557
1101101100001101011000010000101
com.demo.User object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 01 85 b0 86 (00000001 10000101 10110000 10000110) (-2035251967)
4 4 (object header) 6d 00 00 00 (01101101 00000000 00000000 00000000) (109)
8 4 (object header) 07 52 01 f8 (00000111 01010010 00000001 11111000) (-134131193)
12 4 int User.id 1
16 4 java.lang.String User.name null
20 4 (loss due to the next object alignment)
Instance size: 24 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

java对象结构

https://blog.csdn.net/scdn_cp/article/details/86491792

  1. Java对象组成
    Java对象组成
    对象的5个部分的作用:
  • MarkWord主要用来表示对象的线程锁状态,另外还可以用来配合GC、存放该对象的hashCode
  • KlassWord是一个指向方法区中Class信息的指针,意味着该对象可随时知道自己是哪个Class的实例
  • 数组长度这是可选的,只有当本对象是一个数组对象时才会有这个部分
  • 对象体是用于保存对象属性和值的主体部分,占用内存空间取决于对象的属性数量和类型
  • 对齐字节(整个对象大小必须是8的倍数,不够的话,对齐字节来凑)
  1. MarkWord与锁
    MarkWord与锁状态
    MarkWord中锁标记