`

如何获得java对象的内存地址

阅读更多

        在java中内存中的对象地址是可变的,所以获得的内存地址有可能会变化。要获得内存地址也只能通过Unsafe的方法来获得,如下代码片段:

package com.bijian.study;

import java.lang.reflect.Field;
import sun.misc.Unsafe;

public class Addresser {
	
	private static Unsafe unsafe;

	static {
		try {
			Field field = Unsafe.class.getDeclaredField("theUnsafe");
			field.setAccessible(true);
			unsafe = (Unsafe) field.get(null);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static long addressOf(Object o) throws Exception {
		
		Object[] array = new Object[] { o };

		long baseOffset = unsafe.arrayBaseOffset(Object[].class);
		int addressSize = unsafe.addressSize();
		long objectAddress;
		switch (addressSize) {
		case 4:
			objectAddress = unsafe.getInt(array, baseOffset);
			break;
		case 8:
			objectAddress = unsafe.getLong(array, baseOffset);
			break;
		default:
			throw new Error("unsupported address size: " + addressSize);
		}
		return (objectAddress);
	}

	public static void main(String... args) throws Exception {
		Object mine = "Hi there".toCharArray();
		long address = addressOf(mine);
		System.out.println("Addess: " + address);

		// Verify address works - should see the characters in the array in the output
		printBytes(address, 27);
	}

	public static void printBytes(long objectAddress, int num) {
		for (long i = 0; i < num; i++) {
			int cur = unsafe.getByte(objectAddress + i);
			System.out.print((char) cur);
		}
		System.out.println();
	}
}

运行结果:



另一篇java对象内存地址的文章:Java直接内存读写

 

文章来源:http://outofmemory.cn/code-snippet/9456/java-get-object-memory-address

  • 大小: 2.2 KB
分享到:
评论

相关推荐

    测试java对象占用内存大小的例子

    本示例主要探讨如何测试Java对象占用的内存大小,以便更好地理解内存使用情况。 首先,`SizeOf.java`可能是一个实现自定义内存大小计算的类。在Java中,由于垃圾回收机制的存在,直接获取对象的内存占用并不像C++等...

    Excel列表转化成java对象

    通过逐行读取文件,然后按逗号分割每一行得到字段,我们可以轻松地将数据映射到Java对象。 然后,提到的"jaxb"技术,全称Java Architecture for XML Binding,是Java标准中用于XML到Java对象和Java对象到XML的绑定...

    10Java对象的内存布局1

    Java对象的内存布局是Java虚拟机(JVM)中至关重要的一部分,它涉及到对象创建、内存分配以及对象访问等核心概念。在Java程序中,我们通常使用`new`关键字创建对象,但这只是表面操作,背后涉及的内存管理和构造器...

    java获得jvm内存大小

    在Java编程语言中,了解和控制JVM(Java虚拟机)的内存管理是至关重要的,尤其是在性能调优、资源管理和避免内存泄漏等方面。本文将深入探讨如何在Java中获取JVM内存大小,包括堆内存的总量、最大值以及剩余空间,并...

    JAVA对象与XML互转

    2. **DOM解析**:解析XML文件得到DOM树,然后遍历树并创建相应的Java对象。这通常需要手动编写解析代码,比较繁琐。 3. **SAX解析**:Simple API for XML(SAX)是一种事件驱动的解析方式,适合处理大型XML文件。当...

    java实现的内存分配

    堆内存用于存储对象实例,而栈内存则用于存储方法调用时的局部变量和方法参数。除此之外,还有方法区(Method Area)、程序计数器(PC Register)以及本地方法栈(Native Method Stack)等组成部分。 轮转法(Round...

    Java实现IPV6地址查询

    2. **创建IPv6Bean对象**:为每个查询的IPv6地址创建一个`IPv6Bean`实例,存储IP地址本身以及后续查询得到的地理位置信息。 3. **执行查询**:在`IpV6Seeker`类中,实现一个方法,接受IPv6地址作为参数,使用ZX库的...

    java 内存泄漏

    堆内存主要用于存储Java对象实例。这些对象可以是任何类型的Java对象,包括数组、自定义对象等。当我们在代码中创建一个新的对象时,实际上是在堆内存中为该对象分配了一块内存空间。 #### 类变量与实例变量 - **...

    Java对象和类 最详细说明

    ### Java对象和类 最详细说明 #### 一、Java中的对象 在面向对象编程中,对象是核心概念之一。对象可以被理解为现实世界中事物的抽象表示,它具有特定的状态(属性)和行为(方法)。例如,一辆汽车可以被视为一个...

    Java内存模型详解

    本机内存是指Java虚拟机以外的内存区域,主要用于存储直接缓冲区(Direct Buffers)等对象。直接缓冲区是Java NIO框架的一部分,它可以绕过JVM的堆空间,直接访问物理内存,从而提高I/O操作的效率。 #### 4. 防止...

    java使用JMAP定位代码内存泄漏在哪

    Java编程语言在处理大型应用程序时,内存管理是一个至关重要的环节。内存泄漏是导致程序性能下降,甚至引发Out of Memory (OOM)错误的主要原因之一。本文将详细介绍如何使用JMAP工具来定位Java代码中的内存泄漏问题...

    Java内存模型详解JMM.docx

    本机内存是JMM中的一个重要概念,它是指Java虚拟机中的一个区域,用于存储对象实例和数组。本机内存是JMM中的一个重要组成部分,它们之间的关系非常重要。 防止内存泄漏是JMM中的一个重要概念,它是指在Java虚拟机...

    Java加载dll,导致Java进程内存泄露

    内存泄漏通常发生在本地代码(如DLL)中,因为Java垃圾收集器无法管理非Java对象的内存。当Java对象引用了本地资源,例如DLL中的对象,而这些引用没有被正确释放时,就会发生内存泄漏。以下是一些可能导致内存泄漏的...

    Java内存监视器.rar

    1. **堆内存**:存储所有对象实例和数组,是Java中最大的内存区域,通过`System.gc()`触发的垃圾收集主要针对这部分内存。 2. **栈内存**:每个线程都有一个独立的栈,用于存储方法调用时的局部变量、方法参数和...

    java内存参数调优技巧

    - `-Xmx` 和 `-Xms` 参数用于设置Java虚拟机(JVM)的最大堆内存(Maximum Heap Size)和初始堆内存(Initial Heap Size),确保应用启动时就能获得足够的内存空间。通常,为了减少因内存动态调整带来的性能影响,...

    java字符串内存计算

    根据Java内存模型,我们可以得到如下计算公式来估算字符串的内存占用情况: \[ \text{字符串内存占用} = \text{String类头大小} + \text{字符数组占用空间} \] 其中,String类头大小固定为24字节。而字符数组占用...

    深度剖析java内存模型

    Java内存模型(Java Memory Model,简称JMM)是Java虚拟机(JVM)规范中定义的一种内存模型,它涉及了线程之间共享变量的可见性问题。在并发编程中,理解Java内存模型对于编写正确的多线程程序至关重要。 首先,...

    AXIS2中OMElement和Java对象之间的转换

    AXIS2 中 OMElement 和 Java 对象之间的转换 ...AXIS2 中的 OMElement 和 Java 对象之间的转换是非常重要的,通过使用 AXIOM,我们可以提高 XML 处理期间的内存使用率和性能,并且可以大大提高 AXIS2 的性能和扩展性。

Global site tag (gtag.js) - Google Analytics