在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
相关推荐
本示例主要探讨如何测试Java对象占用的内存大小,以便更好地理解内存使用情况。 首先,`SizeOf.java`可能是一个实现自定义内存大小计算的类。在Java中,由于垃圾回收机制的存在,直接获取对象的内存占用并不像C++等...
通过逐行读取文件,然后按逗号分割每一行得到字段,我们可以轻松地将数据映射到Java对象。 然后,提到的"jaxb"技术,全称Java Architecture for XML Binding,是Java标准中用于XML到Java对象和Java对象到XML的绑定...
Java对象的内存布局是Java虚拟机(JVM)中至关重要的一部分,它涉及到对象创建、内存分配以及对象访问等核心概念。在Java程序中,我们通常使用`new`关键字创建对象,但这只是表面操作,背后涉及的内存管理和构造器...
在Java编程语言中,了解和控制JVM(Java虚拟机)的内存管理是至关重要的,尤其是在性能调优、资源管理和避免内存泄漏等方面。本文将深入探讨如何在Java中获取JVM内存大小,包括堆内存的总量、最大值以及剩余空间,并...
2. **DOM解析**:解析XML文件得到DOM树,然后遍历树并创建相应的Java对象。这通常需要手动编写解析代码,比较繁琐。 3. **SAX解析**:Simple API for XML(SAX)是一种事件驱动的解析方式,适合处理大型XML文件。当...
堆内存用于存储对象实例,而栈内存则用于存储方法调用时的局部变量和方法参数。除此之外,还有方法区(Method Area)、程序计数器(PC Register)以及本地方法栈(Native Method Stack)等组成部分。 轮转法(Round...
2. **创建IPv6Bean对象**:为每个查询的IPv6地址创建一个`IPv6Bean`实例,存储IP地址本身以及后续查询得到的地理位置信息。 3. **执行查询**:在`IpV6Seeker`类中,实现一个方法,接受IPv6地址作为参数,使用ZX库的...
堆内存主要用于存储Java对象实例。这些对象可以是任何类型的Java对象,包括数组、自定义对象等。当我们在代码中创建一个新的对象时,实际上是在堆内存中为该对象分配了一块内存空间。 #### 类变量与实例变量 - **...
### Java对象和类 最详细说明 #### 一、Java中的对象 在面向对象编程中,对象是核心概念之一。对象可以被理解为现实世界中事物的抽象表示,它具有特定的状态(属性)和行为(方法)。例如,一辆汽车可以被视为一个...
本机内存是指Java虚拟机以外的内存区域,主要用于存储直接缓冲区(Direct Buffers)等对象。直接缓冲区是Java NIO框架的一部分,它可以绕过JVM的堆空间,直接访问物理内存,从而提高I/O操作的效率。 #### 4. 防止...
Java编程语言在处理大型应用程序时,内存管理是一个至关重要的环节。内存泄漏是导致程序性能下降,甚至引发Out of Memory (OOM)错误的主要原因之一。本文将详细介绍如何使用JMAP工具来定位Java代码中的内存泄漏问题...
本机内存是JMM中的一个重要概念,它是指Java虚拟机中的一个区域,用于存储对象实例和数组。本机内存是JMM中的一个重要组成部分,它们之间的关系非常重要。 防止内存泄漏是JMM中的一个重要概念,它是指在Java虚拟机...
内存泄漏通常发生在本地代码(如DLL)中,因为Java垃圾收集器无法管理非Java对象的内存。当Java对象引用了本地资源,例如DLL中的对象,而这些引用没有被正确释放时,就会发生内存泄漏。以下是一些可能导致内存泄漏的...
1. **堆内存**:存储所有对象实例和数组,是Java中最大的内存区域,通过`System.gc()`触发的垃圾收集主要针对这部分内存。 2. **栈内存**:每个线程都有一个独立的栈,用于存储方法调用时的局部变量、方法参数和...
- `-Xmx` 和 `-Xms` 参数用于设置Java虚拟机(JVM)的最大堆内存(Maximum Heap Size)和初始堆内存(Initial Heap Size),确保应用启动时就能获得足够的内存空间。通常,为了减少因内存动态调整带来的性能影响,...
根据Java内存模型,我们可以得到如下计算公式来估算字符串的内存占用情况: \[ \text{字符串内存占用} = \text{String类头大小} + \text{字符数组占用空间} \] 其中,String类头大小固定为24字节。而字符数组占用...
Java内存模型(Java Memory Model,简称JMM)是Java虚拟机(JVM)规范中定义的一种内存模型,它涉及了线程之间共享变量的可见性问题。在并发编程中,理解Java内存模型对于编写正确的多线程程序至关重要。 首先,...
AXIS2 中 OMElement 和 Java 对象之间的转换 ...AXIS2 中的 OMElement 和 Java 对象之间的转换是非常重要的,通过使用 AXIOM,我们可以提高 XML 处理期间的内存使用率和性能,并且可以大大提高 AXIS2 的性能和扩展性。