有些时候我们需要查看一个对象的构成,java提供了一个工具包可以实现此功能。

文章目录

  • 1、引入jol-core
  • 2、测试
  • 3、对象结构说明
    • 3.1、对象头
      • 3.1.1、Mark Word
      • 3.1.2、KClass Word(类指针)
      • 3.1.3、数组长度
    • 3.2、对象体
    • 3.3、对齐字节

1、引入jol-core

maven:

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

gradle:

implementation group: 'org.openjdk.jol', name: 'jol-core', version: '0.16'

2、测试

public class JolTest {public static void main(String[] args) {User user = new User();System.out.println(ClassLayout.parseInstance(user).toPrintable());System.out.println("--------------------------------------------------");User[] users = new User[10];System.out.println(ClassLayout.parseInstance(users).toPrintable());}
}

运行结果:

com.iscas.biz.domain.common.User object internals:
OFF  SZ                TYPE DESCRIPTION               VALUE0   8                     (object header: mark)     0x000000000000000d (biasable; age: 1)8   4                     (object header: class)    0x0006724812   4   java.lang.Integer User.userId               null16   4    java.lang.String User.userName             null20   4    java.lang.String User.userRealName         null24   4    java.lang.String User.userPwd              null28   4    java.lang.String User.userTel              null32   4    java.lang.String User.userEmail            null36   4   java.lang.Integer User.userStatus           null40   4      java.util.Date User.userCreateTime       null44   4      java.util.Date User.userUpdateTime       null48   4   java.lang.Integer User.count                null52   4                     (object alignment gap)
Instance size: 56 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total--------------------------------------------------
[Lcom.iscas.biz.domain.common.User; object internals:
OFF  SZ                               TYPE DESCRIPTION               VALUE0   8                                    (object header: mark)     0x0000000000000001 (non-biasable; age: 0)8   4                                    (object header: class)    0x0014950012   4                                    (array length)            1012   4                                    (alignment/padding gap)   16  40   com.iscas.biz.domain.common.User User;.<elements>          N/A
Instance size: 56 bytes
Space losses: 4 bytes internal + 0 bytes external = 4 bytes total

3、对象结构说明

对象的结构包括:对象头、对象体、对齐字节

3.1、对象头

对象头包含三部分,Mark Word、Klass Word、数组长度。如果对象不是数组,数组长度可以忽略。

3.1.1、Mark Word

以下是 Java对象处于5种不同状态时,Mark Word中 64位的表现形式,上面每一行代表对象处于某种状态时的样子。其中各部分的含义如下:

 * MarkWord的构成如下:* ------------------------------------------------------------------------------|-----------|*                     Mark Word(64 bits)                                        |  锁状态   |* ------------------------------------------------------------------------------|-----------|* unused:25 | identity_hashcode:31 | unused:1 | age:4 | biased_lock:0 | lock:01 |  正  常   |* ------------------------------------------------------------------------------|-----------|* thread:54 |    epoch:2    |        unused:1 | age:4 | biased_lock:1 | lock:01 |  偏向锁   |* ------------------------------------------------------------------------------|-----------|*                     ptr_to_lock_record:62                           | lock:00 |  轻量级锁 |* ------------------------------------------------------------------------------|-----------|*                 ptr_to_heavyweight_monitor:62                       | lock:11 |  重量级锁 |* ------------------------------------------------------------------------------|-----------|*                                                                     | lock:11 |  GC标记   |* ------------------------------------------------------------------------------|-----------|
  • 1、lock。2位,锁状态的标记位,
  • 2、biased_lock。1位。对象是否存在偏向锁标记。lock与biased_lock共同表示锁对象处于什么锁状态。、
  • 3、age。4位,表示JAVA对象的年龄,在GC中,当survivor区中对象复制一次,年龄加1,如果到15之后会移动到老年代,并发GC的年龄阈值为6.
  • 4、identity_hashcode。31位,调用方法 System.identityHashCode()计算,并会将结果写到该对象头中。当对象加锁后(偏向、轻量级、重量级),MarkWord的字节没有足够的空间保存hashCode,因此该值会移动到线程 Monitor中。
  • 5、thread。54位,持有偏向锁的线程ID。
  • 6、epoch。2位,偏向锁的时间戳。
  • 7、ptr_to_lock_record。62位,轻量级锁状态下,指向栈中锁记录的指针。
  • 8、ptr_to_heavyweight_monitor。62位,重量级锁状态下,指向对象监视器 Monitor的指针。

3.1.2、KClass Word(类指针)

这一部分用于存储对象的类型指针,该指针指向它的类元数据,JVM通过这个指针确定对象是哪个类的实例。该指针的位长度为JVM的一个字大小,即 32位的 JVM为 32位,64位的 JVM为 64位。

如果应用的对象过多,使用 64位的指针将浪费大量内存,统计而言,64位的 JVM将会比 32位的 JVM多耗费 50%的内存。为了节约内存可以使用选项 +UseCompressedOops开启指针压缩,其中,oop即 ordinary object pointer普通对象指针。开启该选项后,下列指针将压缩至32位:

  • 【1】每个 Class的属性指针(即静态变量);
  • 【2】每个对象的属性指针(即对象变量);
  • 【3】普通对象数组的每个元素指针;
    当然,也不是所有的指针都会压缩,一些特殊类型的指针 JVM不会优化,比如指向 PermGen的 Class对象指针(JDK8中指向元空间的 Class对象指针)、本地变量、堆栈元素、入参、返回值和NULL指针等。

3.1.3、数组长度

如果对象是一个数组,那么对象头还需要有额外的空间用于存储数组的长度,这部分数据的长度也随着 JVM架构的不同而不同:32位的JVM上,长度为32位;64位JVM则为64位。64位 JVM如果开启 +UseCompressedOops选项,该区域长度也将由64位压缩至32位。

3.2、对象体

对象体中表示对象中的内容,如对象中每个属性。

3.3、对齐字节

为了方便虚拟机的寻址,比如64位的虚拟机中对象不能被64整除,会补齐对应位。

知道了对象的结构,在结合jol打印出的对象内容就很容易分析了

java使用jol打印对象信息相关推荐

  1. java使用多态打印个人信息_java 多态 回顾

    写了有段时间java了,回头看看最基础的继承问题,挺有意思,把之前不懂的理顺了 public class App9 { public String show(D obj) { return " ...

  2. java打印对象头信息_打印Java对象头

    打印Java对象头 对象头形式 JVM中对象头的方式有以下两种(以32位JVM为例)普通对象|----------------------------------------------------- ...

  3. php 打印对象详细信息,php打印显示数组与对象的函数详解

    php打印显示数组与对象的函数详解 发布于 2014-11-17 18:55:49 | 699 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext P ...

  4. java查看jvm对象个数_jmap-查看 jvm 内存对象信息

    jmap 概述 命令jmap是一个多功能的命令. 它可以生成 java 程序的 dump 文件,也可以查看堆内对象示例的统计信息.查看 ClassLoader 的信息以及 finalizer 队列. ...

  5. java 作业 老师与教员信息 类与对象

    java 作业 老师与教员信息 类与对象 需求 逻辑图 学生类 public class Student {int age; // 年龄String className; // 班级名称String ...

  6. java 7 Reflection详解(二),获取class对象信息

    Technorati 标记: java,reflection,class<T> 承接着第一篇 如何获取class对象 , 这一节将继续谈到如何获取class对象的信息.class对象信息大 ...

  7. Java将对象信息写到word模板中(全网最简单版)

    Java将对象信息写到word模板中 一.首先进行依赖的导入 <!-- 证书模板写入信息 --><dependency><groupId>com.deepoove& ...

  8. Java简单的药店管理系统,实现添加,查询,修改,删除,打印药品信息

    药品信息类 Drug.Java public class Drug { private String drugNum; private String drugName; private String ...

  9. Java入门第44课——打印员工信息

    问题 构建程序,实现员工的信息的打印,打印的效果如图所示: 从上图可以看出,第二次打印员工信息时,该员工的工资上涨25%. 方案 首先,一个员工包含多方面的信息数据,可以考虑使用一个对象来封装员工的数 ...

最新文章

  1. 被马斯克送上天的《银河帝国》和互联网江湖 | 赠书
  2. python 异或加密字符串
  3. #include Windows.h 和 Winsock2.h冲突的改进解决方案
  4. android 查询所有图片和视频,Android系统详解之获取图片和视频的缩略图
  5. mysql删除unionkey_MySQL索引如何优化?二十条铁则送给你
  6. java获取指定年月往前推12个月的年月_java 获取日期的几天前,几个月前和几年前的实例...
  7. 设计素材|美丽的几何和多边形背景纹理
  8. ibm量子计算机 申请,【IBM量子计算机问世,造福人类的杰作!】IBM量子计算机已面前全球开放申请使用_来自网易大神圈子_科学企图玄学...
  9. centos7.5 安装apidoc全过程实测
  10. java生成Excel文件,下载
  11. 20160417_无为_常州
  12. 熬夜整理出40张可视化大屏模板,不敲一个代码就能直接套用
  13. Java下一代高并发技术——虚拟线程“JEP 425: Virtual Threads (Preview)”
  14. 20120329_dmp 文件导入ibm p750-2个LPAR 小机知识点
  15. iReport连接数据库
  16. PPT修改尺寸(修改幻灯片大小)
  17. ZStack-ZCCE-网络实验-VPC网络创建
  18. ffmpeg安装之linux编译安装
  19. DCD、DTR、DSR、RTS及CTS等五个状态指示分别代表什么意思?
  20. Linux 硬盘管理工具

热门文章

  1. 支持服务器CPU的ITX主板,广积科技发布支持英特尔Xeon E处理器的Mini-ITX主板--MI995...
  2. [总结]蓝牙各个版本的关系和区别
  3. svn客户端在服务器创建项目,win7下安装svn服务器端及客户端详细步骤
  4. java基础应用程序超市收银_超市收银程序(JAVA课程设计 2011)
  5. python 删除sheet_Python操作Excel删除一个Sheet
  6. 搜狗微信临时链接的转换
  7. python urllib urllib2 urllib3 用法 区别
  8. 8个超好用的免费工具/软件/网站
  9. Windows漏洞修复服务器,三种Windows服务器SSL/TLS的安全漏洞以及其补救方法
  10. github上如何删除自己的仓库