Jol-分析Java对象的内存布局
2023-12-14 16:06:33
Jol-分析Java对象的内存布局
Open JDK提供的JOL(Java Object Layout)工具为我们方便分析、了解一个Java对象在内存当中的具体布局情况。本文实验环境为64位HotSpot虚拟机。
Java对象的内存布局
Java的实例对象、数组对象在内存中的组成包括:对象头、实例数据和内存填充。
- 对象头主要包括Mark Word、Class对象指针,数组对象还包括数组长度。Mark Word占有8个字节,在Mark Word中记录了哈希码、GC、锁等信息,而Class对象指针则指向该实例的Class对象,在开启指针压缩的情况下占用4个字节,否则占用8个字节,数组对象还需要4个字节用于记录数组长度。
- 实例数据区域用于存放该对象的数据。
- 内存填充是指Java对象地址按8字节对齐,每个对象所占内存的字节数必须是8字节的整数倍。
实例1
- 在maven工程中引入JOL相关包
<!--分析java对象内存布局-->
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.9</version>
</dependency>
- 创建测试类
package org.dsg.threads;
import lombok.Data;
import org.openjdk.jol.info.ClassLayout;
import java.nio.charset.StandardCharsets;
/* 演示对象的内存估算 */
public class OomTooManyObjectTest {
public static void main(String[] args) {
/* 对象本身内存 */
System.out.println(ClassLayout.parseInstance(new Product()).instanceSize());
//一个字符串占用内存
String name = "新华社推新作品";
System.out.println(ClassLayout.parseInstance(name).instanceSize());
System.out.println(16 + name.getBytes(StandardCharsets.UTF_8).length);
}
@Data
private static class Product{
private int id;
private String name;
private int price;
private String desc;
}
}
输出结果:
32
24
37
实例2
- 创建测试类
package org.dsg.threads;
import lombok.Builder;
import lombok.Data;
import org.openjdk.jol.info.ClassLayout;
public class OomTooManyObjectTest {
public static void main(String[] args) {
Product product = Product.builder()
.id(1)
.name("小汽车")
.price(180000)
.desc("长安小汽车很Cool")
.build();
System.out.println(ClassLayout.parseInstance(product).toPrintable());
int[] arr = {11, 12, 13};
System.out.println(ClassLayout.parseInstance(arr).toPrintable());
}
@Data
@Builder
private static class Product{
private int id;
private String name;
private int price;
private String desc;
}
}
输出结果:
文章来源:https://blog.csdn.net/dolly_baby/article/details/134921974
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!