首页 > 系统相关 >使用JOL查看java对象内存结构

使用JOL查看java对象内存结构

时间:2023-06-06 16:57:33浏览次数:45  
标签:java String object bytes 内存 JOL class User

JOL(Java Object Layout) 工具包可以展示java对象在jvm中的结构信息,用来进行内存分析。是由openjdk提供的小工具包。git地址https://github.com/openjdk/jol。因此下面的测试基于hotspot虚拟机环境下。

添加依赖

       <dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.16</version>
        </dependency>

打印JVM基本信息

System.out.println(VM.current().details());
/**
输出内容:
# Running 64-bit HotSpot VM.
# Using compressed oop with 0-bit shift.
# Using compressed klass with 3-bit shift.
# Objects are 8 bytes aligned.
# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
# Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
**/

Objects are 8 bytes aligned 表示对象大小是8bytes的倍数,不足会进行padding填充。

field size 代表各种属性类型所占字节大小:依次是[reference(对象引用类型),boolean,byte,short,char,int,float,long,double]所占的字节大小。

打印class

System.out.println(ClassLayout.parseClass(User.class).toPrintable());
/**
输出:
User object internals:
OFF  SZ               TYPE DESCRIPTION               VALUE
  0   8                    (object header: mark)     N/A
  8   4                    (object header: class)    N/A
 12   4                int User.id                   N/A
 16   4   java.lang.String User.name                 N/A
 20   4                    (object alignment gap)    
Instance size: 24 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
**/

输出8个字节长度的mark work.会包含hashcode,锁状态和垃圾回收等信息。

4个字节长度的kclass信息。共12个长度头。

再往下就是对象的field信息。可以看到有一个4个byte的int型和4个byte的String类型。这里String为什么是4个byte呢?因为是引用类型。

object alignment gap是4,会进行填充。

打印实例对象

        User user = new User();
        user.setName("test");
        user.setId(1);
        System.out.println(ClassLayout.parseInstance(user).toPrintable());
/**
输出:
object internals:
OFF  SZ               TYPE DESCRIPTION               VALUE
  0   8                    (object header: mark)     0x0000000000000005 (biasable; age: 0)
  8   4                    (object header: class)    0x20013287
 12   4                int User.id                   1
 16   4   java.lang.String User.name                 (object)
 20   4                    (object alignment gap)    
Instance size: 24 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
**/

大小和上面的class一样,只不过value有值了。

标签:java,String,object,bytes,内存,JOL,class,User
From: https://www.cnblogs.com/bird2048/p/17461020.html

相关文章

  • java语法特例
    1、当“+”操作中出现字符串时,这个“+”表示字符串连接,而不是算术运算符。但是当表达式中出现多个“+”操作后,在遇到“+”字符串之前还是算术操作符,遇到“+”字符串之后都是字符串连接。System.out.println(1+99+"test");//100testSystem.out.println(1+......
  • javasecript 生成 从2022年到当前季度的所以季度,排倒序
    javasecript 生成从2022年到当前季度的所以季度,排倒序 functiongetQuarter(year,quarter){returnyear+"年"+quarter+"季度";}functiongenerateQuarters(){varcurrentYear=newDate().getFullYear();varcurrentQuarter=Math.floor((......
  • 如何实现Java类隔离加载?
    一什么是类隔离技术只要你Java代码写的足够多,就一定会出现这种情况:系统新引入了一个中间件的jar包,编译的时候一切正常,一运行就报错:java.lang.NoSuchMethodError,然后就哼哧哼哧的开始找解决方法,最后在几百个依赖包里面找的眼睛都快瞎了才找到冲突的jar,把问题解决之后就开始......
  • 24基于java的宠物医院管理系统
    项目背景随着互联网的普及,已经和我们的生活不可分割;宠物渐渐的已经成为了我们的好朋友,宠物医院管理系统可以帮助用户合理的管理宠物,呵护宠物的健康,对宠物起到了一个健康监控的作用;项目介绍系统总体分为3个角色:分别是系统管理员;医生和用户;不能的角色拥有不同的功能权限,下面详......
  • Java-模板生成PDF方式3-HtmlToPDF
    使用thymeleaf做html模板,由xhtmlrenderer/flying-saucer-pdf-openpdf将html转为PDFLGPL和MPL许可pom.xml引入依赖<!--thymeleaf模板引擎--><dependency><groupId>org.springframework.boot</groupId><artifactId>spri......
  • Java-模板生成PDF方式2-PDFBox
    PDFBox文本域+内容流生成PDFBSD许可下的源码开放项目pom.xml引入依赖<!--pdfbox生成PDF--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version>......
  • Java-模板生成PDF方式1-itext5
    itext模板生成PDFpom.xml引入依赖<!--itext生成PDF--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version></dependency><!--输出中文--><dep......
  • Java汉字转拼音工具
    maven依赖<dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.0</version></dependency>工具类封装packagecomg.yang.httpstest.controller.domain;importnet.......
  • 46基于java的校园宿舍管理系统设计与实现
    本章节给大家带来一个基于java的校园宿舍管理系统设计与实现,可适用于智慧校园宿舍管理系统,基于java学生宿舍管理系统,基于java的学生宿舍管理系统,java校园宿舍系统,springboot宿舍管理系统,大学宿舍管理系统;研究背景现在的信息时代是各种资讯纷至沓来的一个年代,而这种资讯的传输......
  • RocketMQ:一个纯java的开源消息中间件--开发测试环境搭建
    一、简介  RocketMQ的前身是Metaq,当 Metaq 3.0发布时,产品名称改为RocketMQ    MetaQ2.x版本由于依赖了alibaba公司内部其他系统,对于公司外部用户使用不够友好,推荐使用3.0版本。   项目地址: https://github.com/alibaba/RocketMQ二、安装RocketMQ   安装Rocket......