前言

我们知道在Java中对于synchronized对于同步方法锁的是当前的实例对象。
例如以下这段代码:

import java.util.concurrent.TimeUnit;public class Test {public static void main(String[] args) {Test test = new Test();test.helper();}public synchronized void helper() {try {System.out.println("hello");TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}}
}

通过dump后我们可以得到以下信息:

"main" #1 prio=5 os_prio=0 tid=0x00c46c00 nid=0x1d60 waiting on condition [0x00ddf000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at java.lang.Thread.sleep(Thread.java:340)at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)at Test.helper(Test.java:16)- locked <0x09db48c0> (a Test)at Test.main(Test.java:10)

Test的实例 test的内存地址为 <0x09db48c0>。我们如何验证这个地址就是我们的内存地址?

正文

引入依赖

在pom.xml中添加依赖:

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

使用

使用很简单:

VM.current().addressOf(test)

放到我们这个代码中就是:

import org.openjdk.jol.vm.VM;import java.util.concurrent.TimeUnit;public class Test {public static void main(String[] args) {Test test = new Test();System.out.println("The memory address is " + VM.current().addressOf(test));System.out.println("The memory address is " + Long.toHexString(VM.current().addressOf(test)));test.helper();}public synchronized void helper() {try {System.out.println("hello");TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}}
}

在控制台我们可以看到输出:

The memory address is 165365952
The memory address is 9db48c0
hello

结论

通过引入org.openjdk.jol我们可以快速的得到对象的内存地址。大致看下相关的源码可以发现底层是使用unsafe类进行判断的。

JOL (Java Object Layout) is the tiny toolbox to analyze object layout schemes in JVMs. These tools are using Unsafe, JVMTI, and Serviceability Agent (SA) heavily to decoder the actual object layout, footprint, and references. This makes JOL much more accurate than other tools relying on heap dumps, specification assumptions, etc.

(Java对象布局)是在jvm中分析对象布局方案的小工具箱。这些工具大量使用Unsafe、JVMTI和Serviceability Agent (SA)来解码实际的对象布局、内存占用和引用。这使得JOL比其他依赖堆转储、规范假设等的工具更精确。

Java获取对象的内存地址相关推荐

  1. java中如何获取对象的内存地址

    java中如何查看对象地址:使用  System.identityHashCode("对象") 即可 eg: Integer i = new Integer(5);System.i ...

  2. Java 获取对象占用内存大小

    1.第一步引入依赖 gradle引入:implementation group: 'org.apache.lucene', name: 'lucene-core', version: '4.0.0'i ...

  3. 蚂蚁一面:hashCode 和对象的内存地址有什么关系?

    前言 先看一个最简单的打印 System.out.println(new Object()); 会输出该类的全限定类名和一串字符串: java.lang.Object@6659c656 @符号后面的是 ...

  4. 【零基础学Java】—对象的内存图(八)

    [零基础学Java]-对象的内存图(八) 一.一个对象的内存图 二.两个对象的内存图 三.使用对象类型作为方法的参数 public class PhoneParam {public static vo ...

  5. hashCode 和对象的内存地址

    hashCode 文章目录 hashCode hashCode 的生成逻辑 第 0 种算法 第 1 种算法 第 2 种算法 第 3 种算法 第 4 种算法 第 5 种算法 根据一定的规则将与对象相关的 ...

  6. Java 中对象占用内存大小计算

    原文地址 mp.weixin.qq.com byte 与 bit bit:位,比特.信息的最小单位,二进制数中的一个位数 (二进制位),其值为"0" 或"1": ...

  7. 【java】java获取对象属性类型、属性名称、属性值

    java获取对象属性类型.属性名称.属性值 获取属性 修饰符:[在Field[]循环中使用] String modifier = Modifier.toString(fields[i].getModi ...

  8. java 收集系统资源_方法:Linux 下用JAVA获取CPU、内存、磁盘的系统资源信息

    CPU使用率: InputStream is = null; InputStreamReader isr = null; BufferedReader brStat = null; StringTok ...

  9. Java获取登录用户IP地址

    Java获取登录用户IP地址 /*** @param * @return * @throws * @description * @author wqd* @date 2021/9/21 13:45*/ ...

最新文章

  1. 重磅图书——PHP MySQL开发新圣经
  2. 如何配置 SQL Server 2005 以允许远程连接
  3. SAP ERP系统业务优化之采购订单追踪
  4. android中判断sim卡状态和读取联系人资料的方法
  5. 多尺度视网膜图像增强_视网膜图像怪异的预测
  6. 【NOIP模拟】健美猫
  7. 26岁的她,成为深圳大学史上最年轻正教授!
  8. fatal: ‘origin‘ does not appear to be a git repository fatal: Could not read from remote repository.
  9. web前端入门指南:来看看这位大佬的学习之路吧!
  10. 最长上升子序列o(nlogn)复杂度一种简单易懂的理解
  11. 蓝桥杯vip答案java_Java实现 蓝桥杯VIP 算法训练 寂寞的数
  12. 关于M1芯片版Mac安装Photoshop后储存psd时出现程序错误提示的解决方法
  13. PreferenceActivity使用介绍
  14. MATLAB初步进行机器学习
  15. dpi shell命令 安卓_夏普手机免root,安装区域中文及隐藏虚拟按键和调整dpi的方法...
  16. linux实训心得体会范文
  17. 尝试做自己不喜欢的事,并努力将其做好
  18. 程序员的第三次 “创业” 我选择继续开发在线客服系统,终于得到了积极反馈
  19. 校园二手物品交易平台实现查询交易订单情况功能
  20. SQL语句条件判断之case when基本用法

热门文章

  1. 经典IT笑话---爱情观
  2. 损失函数(IoU、GIoU、DIoU、CIoU)
  3. Hadoop技术内幕:深入解析MapReduce架构设计与实现原理
  4. java 以太网_java怎样获取以太网的MAC地址
  5. What’s the jiffy?
  6. JavaEE - 多线程(进阶)
  7. consul服务注册与发现机制
  8. vxworks issue: pcie msi interrupt
  9. 【M365运维】- 设定会议室预订的消息推送
  10. Form notifyIcon 系统托盘图标闪动 气泡提示 弹窗