java使用jol打印对象信息
有些时候我们需要查看一个对象的构成,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打印对象信息相关推荐
- java使用多态打印个人信息_java 多态 回顾
写了有段时间java了,回头看看最基础的继承问题,挺有意思,把之前不懂的理顺了 public class App9 { public String show(D obj) { return " ...
- java打印对象头信息_打印Java对象头
打印Java对象头 对象头形式 JVM中对象头的方式有以下两种(以32位JVM为例)普通对象|----------------------------------------------------- ...
- php 打印对象详细信息,php打印显示数组与对象的函数详解
php打印显示数组与对象的函数详解 发布于 2014-11-17 18:55:49 | 699 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext P ...
- java查看jvm对象个数_jmap-查看 jvm 内存对象信息
jmap 概述 命令jmap是一个多功能的命令. 它可以生成 java 程序的 dump 文件,也可以查看堆内对象示例的统计信息.查看 ClassLoader 的信息以及 finalizer 队列. ...
- java 作业 老师与教员信息 类与对象
java 作业 老师与教员信息 类与对象 需求 逻辑图 学生类 public class Student {int age; // 年龄String className; // 班级名称String ...
- java 7 Reflection详解(二),获取class对象信息
Technorati 标记: java,reflection,class<T> 承接着第一篇 如何获取class对象 , 这一节将继续谈到如何获取class对象的信息.class对象信息大 ...
- Java将对象信息写到word模板中(全网最简单版)
Java将对象信息写到word模板中 一.首先进行依赖的导入 <!-- 证书模板写入信息 --><dependency><groupId>com.deepoove& ...
- Java简单的药店管理系统,实现添加,查询,修改,删除,打印药品信息
药品信息类 Drug.Java public class Drug { private String drugNum; private String drugName; private String ...
- Java入门第44课——打印员工信息
问题 构建程序,实现员工的信息的打印,打印的效果如图所示: 从上图可以看出,第二次打印员工信息时,该员工的工资上涨25%. 方案 首先,一个员工包含多方面的信息数据,可以考虑使用一个对象来封装员工的数 ...
最新文章
- 被马斯克送上天的《银河帝国》和互联网江湖 | 赠书
- python 异或加密字符串
- #include Windows.h 和 Winsock2.h冲突的改进解决方案
- android 查询所有图片和视频,Android系统详解之获取图片和视频的缩略图
- mysql删除unionkey_MySQL索引如何优化?二十条铁则送给你
- java获取指定年月往前推12个月的年月_java 获取日期的几天前,几个月前和几年前的实例...
- 设计素材|美丽的几何和多边形背景纹理
- ibm量子计算机 申请,【IBM量子计算机问世,造福人类的杰作!】IBM量子计算机已面前全球开放申请使用_来自网易大神圈子_科学企图玄学...
- centos7.5 安装apidoc全过程实测
- java生成Excel文件,下载
- 20160417_无为_常州
- 熬夜整理出40张可视化大屏模板,不敲一个代码就能直接套用
- Java下一代高并发技术——虚拟线程“JEP 425: Virtual Threads (Preview)”
- 20120329_dmp 文件导入ibm p750-2个LPAR 小机知识点
- iReport连接数据库
- PPT修改尺寸(修改幻灯片大小)
- ZStack-ZCCE-网络实验-VPC网络创建
- ffmpeg安装之linux编译安装
- DCD、DTR、DSR、RTS及CTS等五个状态指示分别代表什么意思?
- Linux 硬盘管理工具
热门文章
- 支持服务器CPU的ITX主板,广积科技发布支持英特尔Xeon E处理器的Mini-ITX主板--MI995...
- [总结]蓝牙各个版本的关系和区别
- svn客户端在服务器创建项目,win7下安装svn服务器端及客户端详细步骤
- java基础应用程序超市收银_超市收银程序(JAVA课程设计 2011)
- python 删除sheet_Python操作Excel删除一个Sheet
- 搜狗微信临时链接的转换
- python urllib urllib2 urllib3 用法 区别
- 8个超好用的免费工具/软件/网站
- Windows漏洞修复服务器,三种Windows服务器SSL/TLS的安全漏洞以及其补救方法
- github上如何删除自己的仓库