引用stackflow的文章:http://stackoverflow.com/questions/8820164/is-there-a-way-to-get-a-reference-address
package addressInMemory; import sun.misc.Unsafe; import java.lang.reflect.Field; import java.util.Arrays; import java.util.Collections; public class OrderOfObjectsAfterGCMain { public static void main(String... args) { Double[] ascending = new Double[16]; for (int i = 0; i < ascending.length; i++) ascending[i] = (double) i; Double[] descending = new Double[16]; for (int i = descending.length - 1; i >= 0; i--) descending[i] = (double) i; Double[] shuffled = new Double[16]; for (int i = 0; i < shuffled.length; i++) shuffled[i] = (double) i; Collections.shuffle(Arrays.asList(shuffled)); System.out.println("Before GC"); System.out.println("ascending" + getAddresses(ascending)); System.out.println("descending" + getAddresses(descending)); System.out.println("shuffled" + getAddresses(shuffled)); System.gc(); System.out.println("\nAfter GC"); System.out.println("ascending" + getAddresses(ascending)); System.out.println("descending" + getAddresses(descending)); System.out.println("shuffled" + getAddresses(shuffled)); System.gc(); System.out.println("\nAfter GC 2"); System.out.println("ascending" + getAddresses(ascending)); System.out.println("descending" + getAddresses(descending)); System.out.println("shuffled" + getAddresses(shuffled)); Object o = new Object(); System.out.println(getAddresses(o)); } public static String getAddresses(Object... objects) { StringBuffer sb = new StringBuffer(); sb.append("0x"); // sun.arch.data.model=32 // 32 bit JVM // sun.arch.data.model=64 // 64 bit JVM boolean is64bit = Integer.parseInt(System.getProperty("sun.arch.data.model")) == 32 ? false : true; Unsafe unsafe = getUnsafe(); long last = 0; int offset = unsafe.arrayBaseOffset(objects.getClass()); int scale = unsafe.arrayIndexScale(objects.getClass()); switch (scale) { case 4: long factor = is64bit ? 8 : 1; final long i1 = (unsafe.getInt(objects, offset) & 0xFFFFFFFFL) * factor; // 输出指针地址 sb.append(Long.toHexString(i1)); last = i1; for (int i = 1; i < objects.length; i++) { final long i2 = (unsafe.getInt(objects, offset + i * 4) & 0xFFFFFFFFL) * factor; if (i2 > last) sb.append(", +" + Long.toHexString(i2 - last)); else sb.append(", -" + Long.toHexString(last - i2)); last = i2; } break; case 8: throw new AssertionError("Not supported"); } return sb.toString(); } private static Unsafe getUnsafe() { try { Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafe.setAccessible(true); return (Unsafe) theUnsafe.get(null); } catch (Exception e) { throw new AssertionError(e); } } }
。。
相关推荐
当我们谈论“Java对象内存大小”时,我们通常指的是一个Java对象在内存中占据的空间,包括对象头、实例字段以及可能的对齐填充。这个知识点对于开发高效缓存系统尤其重要,因为缓存需要精确管理内存来最大化存储效率...
此外,JNI还能获取Java对象的指针,通过`GetObjectRefType`和`GetRawPointer`等方法进行内存地址转换。 3. **JVM内部机制** JVM自身在运行时进行内存地址转换,如栈上分配、对象布局、垃圾回收等。例如,栈上分配...
首先,我们需要理解Java对象内存占用的基本原理。每个Java对象都由三部分组成:对象头(Object Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头包含对象引用和类型信息,实例数据是对象实际存储...
总结来说,这个例子旨在帮助开发者理解Java对象在内存中的表示方式,以及不同类型和结构的对象如何影响内存使用。通过这种方式,开发者可以优化代码,减少不必要的内存开销,提高应用程序的效率。同时,这也提醒我们...
在Java世界中,JVM(Java虚拟机)是运行Java应用程序的关键组件。它负责解析字节码、管理内存以及执行程序。...通过运行这些脚本,我们可以获取更具体的对象内存占用信息,进一步优化我们的Java应用。
总的来说,理解Java对象在内存中的表示方式和占用空间,结合合适的工具进行监控,是开发高效、稳定的Java应用的基础。通过深入学习这些知识点,开发者可以更好地优化程序,提高系统资源利用率,避免因内存问题导致的...
局部引用在本地方法执行完后自动释放,如果需要在本地方法外部持续引用Java对象,应使用`NewGlobalRef()`创建全局引用,并在不再需要时使用`DeleteGlobalRef()`释放。 6. **字段ID和方法ID** 要访问Java对象的字段...
在Java中,对象的创建过程涉及内存分配和初始化。当我们使用`new`关键字创建对象时,首先在堆内存中为对象分配空间,然后调用构造函数初始化对象的属性。对象的引用会被存储在栈内存中,供后续使用。理解这个过程有...
"java-sizeof-0.0.4"是一个用于分析Java对象内存占用的工具,它可以帮助开发者更好地理解对象在运行时的内存消耗。这个工具提供了查看对象实例大小的能力,这对于调试和性能优化非常有用。"java-sizeof-0.0.4"包含三...
首先,Java对象在堆内存中由四个部分组成:对象头(A)、基本类型域(B)、引用类型域(C)和填充物(D)。 **对象头(A)**: 对象头包含了对象的元数据,如对象实例的名字、唯一标识(对象ID)以及对象的状态信息...
这篇博客文章可能探讨了如何通过不同的工具和技术来估算Java对象在内存中的占用空间。 首先,Java对象的大小不是固定不变的,它取决于对象的类结构,包括类中的属性数量、类型以及虚拟机的实现。每个对象都会有一个...
本文将深入探讨如何在Java中获取JVM内存大小,包括堆内存的总量、最大值以及剩余空间,并解析给定代码片段中的关键概念。 ### JVM内存模型 在讨论如何获取JVM内存大小之前,首先需要理解JVM的内存布局。JVM内存...
Java对象的内存结构分为以下几个部分: 1. 对象头:包括标记字段(用于垃圾收集、锁等)和类型指针(指向类元数据)。 2. 实例变量:存储对象的实际数据,每个变量的大小根据其类型确定。 3. 填充:为了内存对齐,...
#### 一、Java数组在内存分配方面的知识 ##### 1.1 数组初始化 - **声明数组的时候如何分配内存:** - 在Java中,数组的声明并不直接分配内存,而仅仅是创建了一个数组引用变量。例如: ```java int[] arr; ``...
在更高级别的语言如Java或.NET中,虽然程序员通常不直接处理内存地址,但仍有工具(如Java的JVisualVM或.NET的CLR Profiler)可以帮助获取对象在内存中的位置和其他相关信息。 标签“内存”表明主题聚焦于内存管理...
在Java编程环境中,实现IPv6地址查询涉及到网络编程和数据库操作。IPv6是互联网协议的第六版,相较于IPv4提供了更大的地址空间,以应对互联网设备数量的急剧增长。本项目利用ZX公网IPv6库(版本20120916)来执行IPv6...
在Java编程语言中,了解如何计算内存中实例化对象的数量是一项重要的技能,这对于优化程序性能、理解和管理资源分配至关重要。本篇文章将详细讲解如何利用静态成员变量来追踪和计算一个类在运行时创建的实例数量。 ...
在Java中,直接获取一个对象所占用的内存大小并非易事。常见的做法是在运行特定代码之前记录当前的内存状态,待代码执行完成后,触发垃圾回收机制,并再次记录内存状态。通过对比两次内存状态的变化,可以估算出代码...
1. 堆内存:Java对象主要存储在堆内存中,过大或过多的对象可能导致堆溢出。 2. 非堆内存:包括JVM自身使用的内存(如方法区、元空间)和线程栈,这部分内存也可能导致溢出。 3. GC(Garbage Collection):Java的...
在Java编程中,获取计算机的硬件信息,如CPU使用率和内存使用情况,是一项常见的需求。这主要应用于系统监控、性能分析以及资源管理等方面。Java虽然不像C++或C#那样可以直接调用操作系统API,但它提供了Java ...