首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么对象调用toString()会影响object头的输出?我正在使用jol包

对象调用toString()方法会影响object头的输出是因为在Java中,每个对象都有一个默认的toString()方法,用于将对象转换为字符串表示。当对象调用toString()方法时,它会返回一个字符串,该字符串包含了对象的信息。

在Java中,对象的头部(header)是对象在内存中的一部分,用于存储对象的元数据信息,如对象的哈希码、锁状态等。当对象调用toString()方法时,它会访问对象的元数据信息,并将其包含在返回的字符串中。

使用jol包可以更深入地了解对象在内存中的布局和结构。jol是一个Java对象布局工具,可以用于分析对象在内存中的字节表示。通过调用jol包提供的API,可以查看对象的布局、字段偏移量等详细信息。

因此,当对象调用toString()方法时,它会访问对象的元数据信息,并将其包含在返回的字符串中。这个过程可能会影响对象头的输出,因为对象头中的元数据信息可能会被修改或更新。

需要注意的是,对象调用toString()方法并不会直接修改对象头的内容,而是通过访问对象的元数据信息来获取对象的状态并返回相应的字符串表示。对象头的内容只能由Java虚拟机来管理和修改。

关于对象调用toString()方法影响object头的输出的更详细信息,可以参考腾讯云的文档《Java对象布局工具(jol)使用指南》(https://cloud.tencent.com/document/product/1131/46347)。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【转】谈谈 JVM 内部锁升级过程

padding 作为对齐使用,对象在 64 位服务器版本中,规定对象内存必须要能被 8 字节整除,如果不能整除,那么就靠对齐来补。...借助于第三方包 JOL = Java Object Layout java 内存布局去看看。很简单的几行代码就可以看到内存布局的样式: 输出结果看: 对象头包含了 12 个字节分为 3 行,其中前 2 行其实就是 Markword,第三行就是 klass 指针。值得注意的是在加锁前后输出从 001 变成了 000。...Markword 用处:8 字节(64bit)的头记录一些信息,锁就是修改了 Markword 的内容 8 字节(64bit)的头记录一些信息,锁就是修改了markword的内容字节(64bit)的头记录一些信息...为什么加偏向锁效率会降低,因为中途多了几个额外的过程,上了偏向锁之后多个线程争抢共享资源的时候要进行锁升级到轻量级锁,这个过程还的把偏向锁进行撤销在进行升级,所以导致效率会降低。为什么是 4s?

40220

并发编程之第三篇(synchronized)

Java6中引入了偏向锁来做进一步优化 :只有第一次使用CAS将线程ID设置到对象的Mark Word头,之后发现这个线程ID是自己的就表示没有竞争,不用重新CAS。...、age都为0,第一次用到hashcode时才会赋值 1)测试延迟特性 2)测试偏向锁 class Dog{} 利用jol第三方工具来查看对象头信息(注意这里我扩展了jol让它输出更为简洁)...输出 ? 撤销-其它线程使用对象 当有其它线程使用偏向锁对象时,会将偏向锁升级为轻量级锁 ? ?...jvm会这样觉得,我是不是偏向错了,于是会在给这些对象加锁时重新偏向至加锁线程 ?...notifyAll()让object上正在waitSet等待的线程全部唤醒 它们都是线程之间进行协作的手段,都属于Object对象的方法。必须获得此对象的锁,才能调用这几个方法 ? ?

44310
  • Java 对象头信息分析和三种锁的性能对比

    Java 头的信息分析 首先为什么我要去研究 java 的对象头呢?这里截取一张 hotspot 的源码当中的注释。...java对象的布局以及对象头的布局 使用 JOL 来分析 java 的对象布局,添加依赖。...由此我们可以认为一个对象的布局大体分为三个部分分别是:对象头(Object header)、 对象的实例数据和字节对齐。 接下来讨论第二个问题,对象头为什么是 12B?...-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0 禁用延迟 结果是和睡眠 5 秒一样的。 想想为什么偏向锁会延迟?...「而偏向锁升级为轻/重量级锁的很费时间和资源,因此 jvm 会延迟 4 秒左右再开启偏向锁。」 「那么为什么同步之前就是偏向锁呢?我猜想是 jvm 的原因,目前还不清楚。」

    51830

    对象实例化与内存布局(深入)

    创建对象方式有:new、Class的newInstance()、Constructor的newInst(Xxx)、使用clone()、使用反序列化、第三方库Objenesis; new创建方式 Student...Mark Word Mark Word 默认存储对象是HashCode,分代年龄和锁标志位信息。Mark Word存储的数据会随着锁标志位的变化而变化。以下表是相关锁的锁状态。...当锁获取是无竞争的时,JVM使用原子操作而不是OS互斥。这种技术称为轻量级锁定。在轻量级锁定的情况下,JVM通过CAS操作在对象的标题字中设置指向锁记录的指针。...相关校验过程 引入jar包 org.openjdk.jol jol-core...),它就无法进入偏向锁状态 当一个对象正在处于偏向锁状态,如果需要计算其 identify hash code 的话,则它的偏向锁会被撤销,并且锁会膨胀为重量锁 重量锁的实现中,ObjectMonitor

    1.1K20

    JDK之JVM中Java对象的头部占多少byte

    图1中对象头部的mark word和kclass pointer占了12bytes,但是最后JVM却认为它占了16bytes,为什么呢,这和内存的aligment有关,所以加了最后的4bytes,让总的...byte数是8的倍数(这里的8表示8bytes,即64bits),为什么是64bits,因为我的机器是64位的,我的JVM是64位的。...3.分析Java的伪分享时考虑对象头部占的byte     我们在做伪分享分析,进行填充数据时,要考虑对象头部,最好自己测试下自己系统JVM上对象头部占多少bytes,不要照搬别人的数据,因为很有可能别人使用的...经过上面的实验,证实类属性对对象占多少byte有影响,那么类的方法数量是否多对象占byte有影响呢?我们来做实验验证下。    ...图5 List-6的运行结果     图5中的结果与图4中的结果一样,说明类的方法数量,对Java对象占多少byte没有影响。当然,这里我只是实验了一个,这个结论不是很严谨。

    1.3K50

    synchronized

    要使用代码查看java对象的内存布局,需要借助jol工具类 org.openjdk.jol jol-core...monitor对象存在于每个Java对象的对象头中(存储的指针的指向),synchronized锁便是通过这种方式获取锁的,也是为什么Java中任意对象可以作为锁的原因,同时也是notify/notifyAll.../wait等方法存在于顶级对象Object中的原因。...两个指令的执行是JVM通过调用操作系统的互斥原语mutex来实现,被阻塞的线程会被挂起、等待重新调度,会导致“用户态和内核态”两个态之间来回切换,对性能有较大影响。...monitor的对象来完成,其实wait/notify等方法也依赖于monitor对象,这就是为什么只有在同步的块或者方法中才能调用wait/notify等方法,否则会抛出java.lang.IllegalMonitorStateException

    50700

    多线程基础(五):java对象的MarkWord及synchronized锁升级过程

    在前面聊过了如何使用synchronized,以及synchronized不同的加锁方式分别锁的是哪些对象。本文对synchronized底层的原理进行深层次的分析。...因此,我们需要用到一个三方的jar包工具jol来对java对象进行查看。 1.1 导入jol 导入的方式比较简单,我们只需要在pom文件中添加如下内容即可: 0.10 之后就可以使用jol来查看对象的内存布局了。...但是需要注意的是,这里每次输出的都是4个字节,再第一行的内部,jol已经帮我们做了处理。因此现在看起来第一行的最后两位才是我们上表中的锁状态位。...重量级锁实际上通过系统调用0x80操作,会阻塞其他线程,针对的是多个线程同时竞争同一个锁的情况,java虚拟机采用了自适应的自旋操作,避免线程进行不必要的阻塞和唤醒的情况。

    93420

    UNSAFE和Java 内存布局

    UNSAFE,顾名思义是不安全的,他的不安全是因为他的权限很大,可以调用操作系统底层直接操作内存空间,所以一般不允许使用。...Java内存中就开辟了一块地址,包含一个固定长度的对象头(假设是16字节,不同位数机器/对象头是否压缩都会影响对象头长度)+实例数据(4字节的a+4字节的b)+padding。...但是在我本地环境是开启了reference(指针)压缩,所以只有12个字节。 2、这里的String和Object为什么都是4字节?...更多内存布局问题请参考: java对象的内存布局(一):计算java对象占用的内存空间以及java object layout工具的使用 Java对象内存结构 JVM内存堆布局图解分析 对象头包含什么内容...在 gc回收的时候,会更新还存活的对象的对象头的分代年龄,同时如果这些对象还有发生位置移动(碎片清理),那么还要重新计算对象头的hash值,以及栈中相应的reference引用的值。

    45810

    全网最硬核 JVM 内存解析 - 5.压缩对象指针相关机制

    也就是让这块虚拟内存是 8 字节对齐,也就是我在使用这块内存时候,最小的分配单元就是 8 字节。...如果配置最大堆内存超过 32 GB(当 JVM 是 8 字节对齐),那么压缩指针会失效(其实不是超过 32GB,会略小于 32GB 的时候就会失效,还有其他的因素影响,下一节会讲到)。...但是,通过 SIGSEGV 信号要经过系统调用,系统调用是一个很低效的行为,我们需要尽量避免(对于抄袭狗就不不必了)。但是这里的假设就是大概率不为 null,所以使用系统调用也无所谓。...TestClass 对象 final TestClass tt = new TestClass(); //使用 jol 输出 tt 指向的对象的结构(抄袭不得好死)...后面的日志是关于 jol 输出对象结构的,可以看出目前这个对象包含一个 markword(0x0000000000000009,由于我的程序启动后输出 jol 日志之前经过了一次 GC,所以当前值与前面一个例子的不一样

    51220

    CAS、ABA问题、锁升级

    .比较两个指:把E和被访问的那个N进行比较,如果和之前是一样的,说明别的线程没有修改该指,那么就把V的值赋值给N if(E==N){ N = V; } 4:假如说被读取的那个值N,在我需要写入的时候改变了...问题来了:虽然回到了原本的状态,但是也经历中间状态,假如中间状态产生了一定的影响,那么其他线程在访问的时候必须要感知到这个被修改过的状态 解决办法:给原本的值增加一个版本号,每次修改时,不仅仅访问比较这个值...,还需要比较版本号,在JDK当中也有使用boolean类型来描述该值是否被修改过 在JDK中有个类:AtomicStampedReference,叫做加标签的参考值 JOL Java对象布局:首先注入依赖...= 4 bytes total 当我们new一个对象的时候,他的结构: markword:对象头,比如synchronized锁定的头信息 class pointer:类型指针:用来指向该对象所属的类型...:只要被访问的资源处于竞争状态时,自动升级为自旋锁,多线程同时并发访问同一个为资源,此时每条线程在自己的线程栈当中生成一个Lock Record对象,并且开始以CAS的自旋方式去抢占被访问的资源,该资源会记录轻量级锁的指针

    44330

    JVM 系列(4)一看就懂的对象内存布局 审核中

    栈上分配的对象会随着栈帧出栈而销毁,不需要经过垃圾收集,能够缓解垃圾收集器的压力。...使用 JOL 分析对象内存布局 这一节我们演示使用 JOL(Java Object Layout)[3] 来分析 Java 对象的内存布局。...: Only HotSpot/OpenJDK VMs are supported 3.1 使用步骤 现在,我们使用 JOL 分析 new Object() 在 HotSpot 虚拟机上的内存布局,模板程序如下...: 示例程序 // 步骤一:添加依赖 implementation 'org.openjdk.jol:jol-core:0.11' // 步骤二:创建对象 Object obj = new Object...我们把 64 位指针的高 32 位截断之后,剩下的 32 位指针也最多只能表示 4G 空间呀? 在解释这个问题之前,我先解释下为什么 32 位指针可以表示 4G 内存空间呢?

    46510

    终于我用JOL打破了你对java对象的所有想象

    今天,小F给大家介绍一款工具JOL,可以满足大家对java对象的所有想象。 02 JOL简介 JOL的全称是Java Object Layout。是一个用来分析JVM中Object布局的小工具。...包括Object在内存中的占用情况,实例对象的引用情况等等。 JOL可以在代码中使用,也可以独立的以命令行中运行。命令行的我这里就不具体介绍了,今天主要讲解怎么在代码中使用JOL。...03 使用JOL分析VM信息 首先我们看下怎么使用JOL来分析JVM的信息,代码非常非常简单: log.info("{}", VM.current().details()); 输出结果: # Running...04 使用JOL分析String 上面的都不是重点,重点是怎么使用JOL来分成class和Instance信息。 其实java中的对象,除了数组,其他对象的大小应该都是固定的。...08 总结 使用JOL可以分析java类和对象,这个对于我们对JVM和java源代码的理解和实现都是非常有帮助的。

    98720

    承前启后,Java对象内存布局和对象头

    承前启后,Java对象内存布局和对象头大家好,我是小高先生。在我之前的一篇文章《并发编程防御装-锁(基础版)》中,我简要介绍了锁的基础知识,并解释了为什么Java中的任何对象都可以作为锁。...在那里,我提到了对象头中有一个指向ObjectMonitor的指针,但没有深入探讨Java对象的内存结构。...Mark Word默认存储hashCode、分代年龄和锁标志位等相关信息,这些信息都是与对象自身定义无关的数据,会根据对象的状态复用自己的存储空间,运行期间数据会随着锁状态而改变。...JOL有关Java对象布局的理论知识已经学完了,那能不能从代码层面验证一下对象的结构呢。JOL(Java Object Layout)是一个专门用于分析Java虚拟机(JVM)中对象内存布局的工具箱。...4而不是8,这是因为压缩指针的影响。

    20110

    几百万数据放入内存不会把系统撑爆吗?

    在公司有一个需求是要核对一批数据,之前的做法是直接用SQL各种复杂操作给怼出来的,不仅时间慢,而且后期也不好维护,就算原作者来了过一个月估计也忘了SQL什么意思了,于是有一次我就想着问一下之前做这个需求的人为什么不将这些数据查出来后在内存里面做筛选呢...JDK提供了一个工具jol-core可以给我们分析出来一个对象在内存中占用的内存大小。直接在项目中引入包即可。...> jol-core 0.9 然后我们在main函数中调用如下 public...,可以看到输出结果占用的内存是16字节,和我们分析的一样。...至于为什么要初始化大小的原因就是为了消除集合在扩容时对我们观察结果的影响 这里我贴一张,集合未初始化大小和初始化大小内存占用对比图,大家可以看到是有内存上的差异,在ArrayList数组中用于存放数据的是

    78121

    几百万数据放入内存不会把系统撑爆吗?

    在公司有一个需求是要核对一批数据,之前的做法是直接用SQL各种复杂操作给怼出来的,不仅时间慢,而且后期也不好维护,就算原作者来了过一个月估计也忘了SQL什么意思了,于是有一次我就想着问一下之前做这个需求的人为什么不将这些数据查出来后在内存里面做筛选呢...JDK提供了一个工具jol-core可以给我们分析出来一个对象在内存中占用的内存大小。直接在项目中引入包即可。...> jol-core 0.9 然后我们在main函数中调用如下 public...,可以看到输出结果占用的内存是16字节,和我们分析的一样。...至于为什么要初始化大小的原因就是为了消除集合在扩容时对我们观察结果的影响 这里我贴一张,集合未初始化大小和初始化大小内存占用对比图,大家可以看到是有内存上的差异,在ArrayList数组中用于存放数据的是

    3.4K51

    JVM系列之:详解java object对象在heap中的结构

    简介 在之前的文章中,我们介绍了使用JOL这一神器来解析java类或者java实例在内存中占用的空间地址。 今天,我们会更进一步,剖析一下在之前文章中没有讲解到的更深层次的细节。一起来看看吧。...看下输出: ? 从上面的结果我们知道,在64位的JVM中,一个Object实例是占用16个字节。 因为Object对象中并没有其他对象的引用,所以我们看到Object对象只有一个12字节的对象头。...有的小伙伴可能发现了问题,之前我们用JOL解析Object对象的时候,Object head大小是12字节,也就是96bits,这里怎么写的是128bits? ?...在此之前,可以使用-XX:+UseCompressedOops来开启。 数组对象头 java中有一个非常特别的对象叫做数组,数组的对象头和Object有什么区别吗?...大家看到最后的字节是padding填充字节,为什么要填充呢? 因为JVM是以8字节为单位进行对其的,如果不是8字节的整数倍,则需要补全。

    1.1K41

    你写的Java对象究竟占多少内存?

    Klass Word 这里其实是虚拟机设计的一个oop-klass model模型,这里的OOP是指Ordinary Object Pointer(普通对象指针),看起来像个指针实际上是藏在指针里的对象...我们执行看看结果如何: 这里我们发现结果显示:Instance size:16 bytes,结果就是16字节,我们之前预测的12字节不一样,为什么会这样呢?...我们看到上图中有3行 object header,每个占用4字节,所以头部就是12字节,这里和我们的计算是一致的,最后一行是虚拟机填充的4字节,那为什么虚拟机要填充4个字节呢?...回到Java空对象填充了4个字节的问题,因为原字节头是12字节,64位机器下,内存对齐的话就是128位,也就是16字节,所以我们还需要填充4个字节。...这也是如何分析一个对象真正的占用多少内存的思路,根据这个思路加上openJDK的jol工具就可以基本的掌握自己写的“对象”究竟败家了你多少内存。

    1.3K40
    领券