当前位置: 首页 > news >正文

Jol-分析Java对象的内存布局

Jol-分析Java对象的内存布局

Open JDK提供的JOL(Java Object Layout)工具为我们方便分析、了解一个Java对象在内存当中的具体布局情况。本文实验环境为64位HotSpot虚拟机。

Java对象的内存布局

Java的实例对象、数组对象在内存中的组成包括:对象头、实例数据和内存填充。

v2-961b928cf04da5ce629ee08fd767191e_720w

  • 对象头主要包括Mark Word、Class对象指针,数组对象还包括数组长度。Mark Word占有8个字节,在Mark Word中记录了哈希码、GC、锁等信息,而Class对象指针则指向该实例的Class对象,在开启指针压缩的情况下占用4个字节,否则占用8个字节,数组对象还需要4个字节用于记录数组长度。
  • 实例数据区域用于存放该对象的数据。
  • 内存填充是指Java对象地址按8字节对齐,每个对象所占内存的字节数必须是8字节的整数倍。

v2-773175d3d55668daf774d1b0fd0427b1_720w.webp

实例1

  1. 在maven工程中引入JOL相关包
<!--分析java对象内存布局-->
<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.9</version>
</dependency>
  1. 创建测试类
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);}@Dataprivate static class Product{private int id;private String name;private int price;private String desc;}
}

输出结果:

32
24
37

实例2

  1. 创建测试类
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@Builderprivate static class Product{private int id;private String name;private int price;private String desc;}
}

输出结果:

image-20231211105723621

http://www.lryc.cn/news/257642.html

相关文章:

  • 基于sfunction builder的c-sfunction编写及案例测试分析
  • 【Java期末复习资料】(1)知识点总结
  • 进程、容器与虚拟机的区别
  • 全网快递批量查询的得力助手
  • uniapp开发小程序经验记录
  • PR自动剪辑视频工具AI智能剪辑插件AutoPod
  • Visual Studio 2022+Python3.11实现C++调用python接口
  • 10天玩转Python第2天:python判断语句基础示例全面详解与代码练习
  • 2024年网络安全竞赛-网站渗透
  • kafka学习笔记--基础知识概述
  • 聊聊AsyncHttpClient的KeepAliveStrategy
  • 视频推拉流直播点播EasyDSS平台点播文件加密存储的实现方法
  • LVGL——按钮部件
  • RE2文本匹配调优实战
  • Java - 线程间的通信方式
  • 【计算机网络】HTTP响应报文Cookie原理
  • 2023年度盘点:智能汽车、自动驾驶、车联网必读书单
  • 一文讲解如何从 Clickhouse 迁移数据至 DolphinDB
  • [足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-5Laplace Transform of Convolution卷积的拉普拉斯变换
  • 生产问题: 利用线程Thread预加载数据缓存,其它类全局变量获取缓存偶发加载不到
  • Elasticsearch mapping 之 性能相关配置
  • adb push报错:remote couldn‘t create file: Is a directory
  • GitLab 服务更换了机器,IP 地址或域名没有变化时,可能会出现无法拉取或提交代码的情况。
  • 【华为OD题库-076】执行时长/GPU算力-Java
  • 持续集成交付CICD:Jenkins使用GitLab共享库实现前后端项目Sonarqube
  • Linux文件结构与文件权限
  • CentOS上安装和配置Apache HTTP服务器
  • 前端知识(十二)———ES6迭代器
  • 云端仓库平台
  • php第三方skd自动加载