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

news2024/11/25 11:56:25

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);
    }

    @Data
    private 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
    @Builder
    private static class Product{
        private int id;
        private String name;
        private int price;
        private String desc;
    }
}

输出结果:

image-20231211105723621

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1301452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一键优化工具,十分不错的win7、win10系统优化的工具,可以帮助用户轻松快速优化系统,供大家学习研究参考~

主要功能 01、禁用索引服务 02、禁止window发送错误报告 03、禁用"最近使用的项目” 04、关闭Windows Defender 05、关闭防火墙 06、检查更新而不自动下载更新 07、启动电源计划“高性能” 08、调整电源选项 09、禁用休眠(删除休眠文件) 10、开启快速启动 11、…

【lesson3】数据库表的操作

文章目录 创建修改修改表名增加表类型修改表的某一类型的类型修改表某一类型的类型名 删除删除表的某一列删除表 查看查看表信息查看表内容 创建 建表指令&#xff1a; 查看是否建表成功&#xff1a; 查看表的具体信息&#xff1a; 修改 修改表名 法一&#xff1a;修改…

yolov5目标检测

一、安装 1.源码下载 git clone git://github.com/ultralytics/yolov5.git cd yolov5 2.环境配置 conda create -n yolov5 python3.8 conda activate yolov5 nvcc -V查看cuda版本 pytorch官网下载对应版本&#xff0c;例如当cuda版本为11.6 pip install torch1.13.1cu…

阿里云服务器租用价格分享,阿里云服务器热门配置最新活动价格汇总

在我们购买阿里云服务器的时候&#xff0c;1核2G、2核2G、2核4G、2核8G、4核8G、8核16G、8核32G等配置属于用户购买最多的热门配置&#xff0c;1核2G、2核2G、2核4G这些配置低一点的云服务器基本上能够满足绝大部分个人建站和普通企业用户建站需求&#xff0c;而4核8G、8核16G、…

Vue之模板语法

模板语法有两大类&#xff1a; 1.插值语法 2.指令语法 让我为大家介绍一下吧&#xff01; 一、插值语法 功能:用于解析标签体内容。 写法: {{xxx}}&#xff0c;xxx是js表达式&#xff0c;且可以直接读取到data中的所有属性。 举个例子&#xff1a; <!DOCTYPE html> &l…

六级高频词汇3

目录 单词 参考链接 单词 400. nonsense n. 胡说&#xff0c;冒失的行动 401. nuclear a. 核子的&#xff0c;核能的 402. nucleus n. 核 403. retail n. /v. /ad. 零售 404. retain vt. 保留&#xff0c;保持 405. restrict vt. 限制&#xff0c;约束 406. sponsor n. …

LinuxBasicsForHackers笔记 -- BASH 脚本

你的第一个脚本&#xff1a;“你好&#xff0c;黑客崛起&#xff01;” 首先&#xff0c;您需要告诉操作系统您要为脚本使用哪个解释器。 为此&#xff0c;请输入 shebang&#xff0c;它是井号和感叹号的组合&#xff0c;如下所示&#xff1a;#! 然后&#xff0c;在 shebang …

“我“的测试之路,从初级测试到测试开发,往后前景...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试工程师的现…

C++ //习题2.5 请写出下列表达式的值。

C程序设计 &#xff08;第三版&#xff09; 谭浩强 习题2.5 习题2.5 请写出下列表达式的值。 (1) 3.5 * 3 2 * 7 - ‘a’ (2) 26 / 3 34 % 3 2.5 (3) 45 / 2 (int)3.14159 / 2 (4) a b (c a 6) 设a的初值为3 (5) a 3 * 5, a b 3 * 2 (6) (int)(a 6.5) % 2 …

DevEco Studio 3.1IDE环境配置(HarmonyOS 3.1)

DevEco Studio 3.1IDE环境配置&#xff08;HarmonyOS 3.1&#xff09; 一、安装环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、环境安装 IDE下载地址&#xff1a;HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 IDE的安装就是…

家具制造ERP软件包含哪些功能?家具制造业ERP系统哪个好

不同的家具有不同的用料、品质、制造工时、营销渠道等&#xff0c;而有些家具制造企业采用传统的管理方式在处理物料BOM、生产实际成本核算、库存盘点、供应商选择、班组计件核对、生产领用以及物料追溯等方面存在不少提升空间。 与此同时也有很多的皮具制造企业借助ERP软件优…

探索HarmonyOS_开发软件安装

随着华为推出HarmonyOS NEXT 宣布将要全面启用鸿蒙原声应用&#xff0c;不在兼容安卓应用&#xff0c; 现在开始探索鸿蒙原生应用的开发。 HarmonyOS应用开发官网 - 华为HarmonyOS打造全场景新服务 鸿蒙官网 开发软件肯定要从这里下载 第一个为微软系统(windows)&#xff0c;第…

GLAB | CCNA+HCIA=融合课-最新开课通知

敲重点! 12月17日 CCNAHCIA 周日开课啦&#xff01; CCNA&#xff08;Cisco Certified Network Associate&#xff09;认证是Cisco售后工程师认证体系的入门认证&#xff0c;也是Cisco各项认证中级别最低的技术认证通过CCNA认证可证明你已掌握网络的基本知识&#xff0c;并能…

docker 一键寻找容器在服务器存储位置

docker ps -a找到容器id/容器名称 docker inspect 容器id/容器名称 | grep UpperDir找出该容器在物理机的位置 inspect作用:查看docker详细信息 cd到UpperDir所指向的地址&#xff0c;找到配置文件并修改,到这后,这个位置和你用exec命令进入容器内看到文件是一致的

盛域宏数合伙人张天:AI时代,数字化要以AI重构

大数据产业创新服务媒体 ——聚焦数据 改变商业 在这个飞速发展的科技时代&#xff0c;数字化已经深刻地改变了我们的生活和商业方式。信息技术的迅猛发展使得数据成为现代社会最宝贵的资源之一。数字化已经不再是可选项&#xff0c;而是企业持续发展的必由之路。背靠着数据的…

【LeetCode:1631. 最小体力消耗路径 | BFS + 二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

高仿B站视频网站系统源码 附带完整的搭建教程

现如今&#xff0c;视频分享网站逐渐成为人们休闲娱乐和学习知识的重要平台。B站作为中国最大的弹幕视频网站之一&#xff0c;以其独特的弹幕系统、丰富的内容和良好的用户体验赢得了广大用户的喜爱。然而&#xff0c;对于一些想要搭建自己的视频分享网站的用户来说&#xff0c…

【ScienceAI Weekly】IBM新AI芯片提效25倍;清华大学发AI辅助框架;DeepMind新工具预测220万新晶体

「ScienceAI Weekly」是 HyperAI 超神经新创建的半月更栏目&#xff0c;主要从科研成果、企业动态、工具资源、近期活动 4 个维度&#xff0c;收集呈现 ScienceAI 领域近期值得关注的最新动态&#xff0c;以期为长期关注该领域的从业者、爱好者&#xff0c;提供更有价值的圈内资…

Docker中的常见命令

Docker开机自启 systemctl enable dockerDocker容器开机自启 docker update --restartalways [容器名/容器id]案例&#xff1a;docker操作nginx 拉取Nginx镜像 docker pull nginx查看镜像 docker images创建并运行Nginx容器 docker run -d --name nginx -p 80:80 nginx查…

19、线性容器、适配器容器

19、线性容器、适配器容器 线性容器向量 vector初始化迭代器使用 双端队列 deque双端队列和向量的差别成员函数 列表 list常用函数 适配器容器栈队列 线性容器 向量 vector 成员函数 front() 获取首元素 back() 获取尾元素 insert() 插入元素 erase() 删除元素 push_back() …