java通过jol-core库分析对象内存分布以及查看Synchronized锁升级过程

news2024/11/16 7:38:38

    在Java开发中,我们可以借助jol-core这个库来查看对象内存信息。

     引入依赖:

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

    要查看对象内存信息,我们只需要调用ClassLayout.parseInstance(object).toPrintable() 

    如下所示的代码,是查看两个对象信息:

package com.xxx.mem;
import org.openjdk.jol.info.ClassLayout;
public class ObjectPrintExample {
    public static void main(String[] args) {
        Object object = new Object();
        System.out.println(ClassLayout.parseInstance(object).toPrintable());
        Object[] arr = new Object[10];
        System.out.println(ClassLayout.parseInstance(arr).toPrintable());
    }
}

    运行程序,打印信息如下所示:

 

    从打印内容来看,我们看到了对象包含:对象头,对象体,对齐字节。

    其中对象头包括: mark word,klass word,数组长度。如果对象不是数组,数组长度可以忽略不记,上图中,我们打印object,数组长度就没有体现(array length)。

    我们这里重点关注一下对象头中的mark word,如下所示:

    这里面通过对象头64位中的最后3位的值,我们看到它们取值不同,可能会出现几种状态,其中无锁 、偏向锁、轻量级锁,重量级锁正是Sychronized锁升级过程中表现出来的升级状态。

    下面我们通过一段代码的运行来感受一下这几个状态的变化:

package com.xxx.mem;
import org.openjdk.jol.info.ClassLayout;
import java.util.concurrent.TimeUnit;
public class LayoutPrintExample {
    public static void main(String[] args) throws InterruptedException {
        Object o = new Object();
        // Step 1
        System.out.println(ClassLayout.parseInstance(new Object()).toPrintable());
        TimeUnit.SECONDS.sleep(4);
        // Step 2
        System.out.println(ClassLayout.parseInstance(new Object()).toPrintable());
        //Step 3
        synchronized(o) {
            System.out.println(ClassLayout.parseInstance(o).toPrintable());
        }
        // Step 4
        new Thread(()-> {
            synchronized(o) {
                System.out.println(ClassLayout.parseInstance(o).toPrintable());
            }
        }).start();
        // Step 5
        new Thread(()-> {
            synchronized(o) {
                System.out.println(ClassLayout.parseInstance(o).toPrintable());
            }
        }).start();
    }
}

    这段代码直接运行,可能达不到我们需要的效果,因为jdk默认不会开启偏向锁,所以我们要手动开启,并且设置一个延时4秒,这样我们正好看清整个锁升级过程。

    虚拟机参数:-XX:BiasedLockingStartupDelay=4 -XX:+UseBiasedLocking

    运行程序,打印结果:

 

    这个结果的解释:

   step1,程序刚开始运行,因为开启了偏向锁,第一次打印无锁状态。

   step2,这里睡眠4秒,相当于延时4秒,虚拟机偏向锁生效,打印出偏向锁状态。

   step3,由于程序调用synchronized,对象锁升级为轻量级锁。

   step4,在线程中调用synchronized,这时候竞争并不是很激烈,还是轻量级锁。

   step5,在另一个线程中调用synchronized,相当于多线程环境,这时候竞争激烈,自身cas已经无法满足需求,对象锁升级为重量级锁。

    这里我们通过对象头markword也看出了锁状态,分别是non-biasable,biasable,thin lock,thin lock,fat lock。另外,通过16进制对应的二进制结果也验证了一下markword对应后三位状态。

    jol-core可能因为版本不同,显示的markword,可能是十六进制,也有可能是二进制,如果是二进制,我们需要注意,是否为小端序、大端序,如果端序搞错,结果有可能不是我们期望的锁状态。

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

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

相关文章

深度学习系列52:多目标跟踪

1. 评价指标 1&#xff09;FP&#xff1a;False Positive&#xff0c;即真实情况中没有&#xff0c;但跟踪算法误检出有目标存在。 2&#xff09;FN&#xff1a;False Negative&#xff0c;即真实情况中有&#xff0c;但跟踪算法漏检了。 3&#xff09;IDS&#xff1a;ID Sw…

【数据结构】数组和字符串(六):特殊矩阵的压缩存储:稀疏矩阵——压缩稀疏列(Compressed Sparse Column,CSC)

文章目录 4.2.1 矩阵的数组表示4.2.2 特殊矩阵的压缩存储a. 对角矩阵的压缩存储b~c. 三角、对称矩阵的压缩存储d. 稀疏矩阵的压缩存储——三元组表e. 压缩稀疏行&#xff08;Compressed Sparse Row&#xff0c;CSR&#xff09;矩阵f. 压缩稀疏列&#xff08;Compressed Sparse …

【计算机毕设小程序案例】基于微信小程序的图书馆座位预定系统

前言&#xff1a;我是IT源码社&#xff0c;从事计算机开发行业数年&#xff0c;专注Java领域&#xff0c;专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 &#x1f449;IT源码社-SpringBoot优质案例推荐&#x1f448; &#x1f449;IT源码社-小程序优质案例…

Android拖放startDragAndDrop拖拽onDrawShadow动态添加View,Kotlin(3)

Android拖放startDragAndDrop拖拽onDrawShadow动态添加View&#xff0c;Kotlin&#xff08;3&#xff09; import android.content.ClipData import android.graphics.Canvas import android.graphics.Point import android.os.Bundle import android.util.Log import android.…

【linux】麒麟v10安装Redis主从集群(ARM架构)

安装redis单示例的请看&#xff1a;麒麟v10安装Redis&#xff08;ARM架构&#xff09; 安装环境 ​Hostname​IP addressmaster192.168.0.1slave1192.168.0.2slave2192.168.0.3 下载安装包 &#xff08;三台都操作&#xff09; wget https://repo.huaweicloud.com/kunpeng/…

iStat Menus v6.72

iStat Menus是一款Mac电脑上的系统监控工具&#xff0c;它可以帮助用户监测电脑的硬件和软件状况&#xff0c;提供实时的系统数据和统计信息。 其主要特点包括&#xff1a; 1.系统监测&#xff1a;iStat Menus可以监测CPU、内存、硬盘、网络、电池等系统参数&#xff0c;方便…

SLAM从入门到精通(lidar的运动畸变矫正)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;很多时候传感器的数据并不能直接拿过来使用。这里面除了噪声的原因之外&#xff0c;另外一部分原因就是传感器数据本身也…

Linux 多架构支持介绍和实践

Linux 多架构支持介绍和实践 1. Linux 上多架构支持指的是什么意思&#xff1f; 在Linux 上开启多架构支持&#xff08;multi-arch support&#xff09;&#xff0c;指的是可以让您在同一系统上安装多个不同架构的软件包&#xff0c;这在交叉编译的场景显得格外重要。 以下实…

分享一下怎么做一个微信抽奖活动

抽奖活动是当今社会中非常流行的一种营销方式&#xff0c;它能够有效地吸引消费者的注意力&#xff0c;提高品牌知名度和销售额。在举办抽奖活动时&#xff0c;需要制定相应的规则和奖励设置&#xff0c;以确保活动的公平性和吸引力。本文将详细介绍如何制作一个有效的抽奖活动…

外汇天眼:如何有效地交易外汇?15个基本提示!

外汇是买卖货币的行为。日均交易量超过6万亿美元&#xff0c;是世界上最大的金融市场。鉴于其规模和可及性&#xff0c;许多人被高回报的承诺所吸引。但是&#xff0c;如果没有适当的知识和纪律&#xff0c;交易可能会有风险。在本文中&#xff0c;很好地分解了有效交易外汇的基…

2023高频前端面试题-浏览器

1. 浏览器是如何解析 CSS 选择器的&#xff1f; 在生成渲染树的过程中&#xff0c;渲染引擎会根据选择器提供的信息来遍历 DOM 树&#xff0c;找到对应的 DOM 节点后将样式规则附加到上面。 来看一段样式选择器代码、以及一段要应用样式的 HTML&#xff1a; .mod-nav h3 spa…

AI口语APP第三方接口

AI口语练习应用程序通常可以通过第三方接口来集成语音识别、自然语言处理和其他相关功能。以下是一些常见的第三方接口及其特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.Google Cloud Speech…

如何设计元宇宙展厅,元宇宙展厅的展示和交互形式有哪些?

引言&#xff1a; 元宇宙是当下科技界最为炙手可热的话题之一&#xff0c;被誉为数字世界的未来。将元宇宙与展厅结合&#xff0c;展示产品信息成了很多人关注的热点&#xff0c;那么元宇宙展厅应该如何设计呢&#xff1f; 一&#xff0e;元宇宙展厅设计理念 1.创造虚拟与现实…

为什么选择Codigger静态分析?

开发每个阶段的安全代码 Codigger是一种很流行的静态分析工具&#xff0c;用于持续检查代码库的代码质量和安全性&#xff0c;并在代码评审期间指导开发团队。代码审查是一种系统的软件质量保证技术&#xff0c;通过审查开发人员的代码来发现和修复问题、提高代码质量并执行编码…

九月手游出海三黑马,营销上如何做到成功?

从2022年开始&#xff0c;手游出海红利几乎完全消失&#xff0c;在经历高速发展的黄金阶段过渡到竞争激烈的精品化阶段&#xff0c;再到目前“不上不下”的存量竞争时代。 现在手游出海到底面临怎么样的困境&#xff1f;是全球经济下行、隐私政策更新频繁、国际形势变化莫测、…

【工具使用】使用Audition增加增益的方法

一&#xff0c;简介 本文主要介绍如何在Adobe Audition 2020中改变波形的幅值。供参考。 二&#xff0c;操作方法 这里使用1KHz&#xff0c;-120dB信号为例。 2.1 方法一&#xff1a;直接使用悬浮窗口 窗口中输入6&#xff0c;波形的幅值就变成了-114dB。 注意&#xff1a…

ChatGLM系列五:Lora微调

目前主流对大模型进行微调方法有三种&#xff1a;Freeze方法、P-Tuning方法和Lora方法 LoRA: 在大型语言模型上对指定参数&#xff08;权重矩阵&#xff09;并行增加额外的低秩矩阵&#xff0c;并在模型训练过程中&#xff0c;仅训练额外增加的并行低秩矩阵的参数,冻结其他参数…

Java中级面试题记录(四)

一面面试题 1.Innodb的行数据存储模式 https://baijiahao.baidu.com/s?id1775090633458928876&wfrspider&forpc 2.行数据包含哪些信息&#xff1f; https://baijiahao.baidu.com/s?id1775090633458928876&wfrspider&forpc 3.MySQL在进行存储VARCHAR的时…

qq怎么发长视频?超级好用!

在平时的工作和生活中&#xff0c;我们会想分享一些比较长的内容。但是我们会发现视频文件过大&#xff0c;可能会超过腾讯规定的单次发送文件的大小限制&#xff0c;导致无法发送成功。这时候就需要借助一些视频压缩工具&#xff0c;下面介绍了四种方法&#xff0c;一起来看看…

浅谈信息化与数字化

一、信息化/数字化的概念 信息化、数字化按字面意思理解&#xff0c;这两个词的确代表了不同的含义。但是也不可否认&#xff0c;在目前我们可以接触到的信息平台来看。信息化、数字化很多时候都被混在一起了。 那么&#xff0c;既然今天要聊这个话题。我们得先把这两个词分清…