/**
*
* http://hi.baidu.com/whzkinger/blog/item/84e82b01295a500d7bec2c0e.html
*
*/
public class TestSizeOf {
private static final Runtime s_runtime = Runtime.getRuntime();
public static void main(String[] args) throws Exception {
// Warm up all classes/methods we will use
runGC();
usedMemory();
// Array to keep strong references to allocated objects
final int count = 100000;
Object[] objects = new Object[count];
long heap1 = 0;
// Allocate count+1 objects, discard the first one
for (int i = -1; i < count; ++i) {
Object object = null;
// Instantiate your data here and assign it to object
object = new Object();
//object = new Integer (i);
//object = new Long (i);
//object = new String ();
//object = new byte [128][1];
if (i >= 0) {
objects[i] = object;
} else {
object = null; // Discard the warm up object
runGC();
heap1 = usedMemory(); // Take a before heap snapshot
}
}
runGC();
long heap2 = usedMemory(); // Take an after heap snapshot:
final int size = Math.round(((float) (heap2 - heap1)) / count);
System.out.print("after heap(" + heap2 + ")-before heap(" + heap1 + ")=" + (heap2 - heap1)
+ "\nclassName=" + objects[0].getClass().getName() + "\nsize=" + size
+ " bytes");
for (int i = 0; i < count; ++i) {
objects[i] = null;
}
objects = null;
}
private static void runGC() throws Exception {
// It helps to call Runtime.gc()
// using several method calls:
for (int r = 0; r < 4; ++r) {
_runGC();
}
}
private static void _runGC() throws Exception {
long usedMem1 = usedMemory();
long usedMem2 = Long.MAX_VALUE;
for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++i) {
s_runtime.runFinalization();
s_runtime.gc();
Thread.currentThread().yield();
usedMem2 = usedMem1;
usedMem1 = usedMemory();
}
}
private static long usedMemory() {
return s_runtime.totalMemory() - s_runtime.freeMemory();
}
}
分享到:
相关推荐
本文将深入探讨如何计算Java对象的大小,以及这个知识点在实际开发中的应用。 首先,Java对象的大小不仅仅包括其字段的大小,还包括对象头(object header)的大小,对于HotSpot虚拟机,它包含了对齐填充、Mark ...
总的来说,通过`sizeOf`计算Java对象的大小是一项复杂的工作,涉及到JVM内部的内存管理和对象表示。尽管Java API没有直接提供这样的功能,但我们可以借助第三方库或自定义工具来实现。理解对象大小对于优化内存使用...
本篇文章将深入探讨如何计算Java对象占用的内存字节数,以及影响这一数值的因素。 首先,Java对象在堆内存中由四个部分组成:对象头(A)、基本类型域(B)、引用类型域(C)和填充物(D)。 **对象头(A)**: ...
本文将深入探讨如何计算Java对象所占内存,并通过提供的代码示例进行详细解析。 首先,我们需要理解Java对象内存占用的基本原理。每个Java对象都由三部分组成:对象头(Object Header)、实例数据(Instance Data)...
本示例“测量Java对象大小的demo”提供了一种方法,通过使用Java的`java.lang.instrument`包来注入`javaagent`,进而利用`Instrumentation`接口测量Java对象的精确内存占用。下面我们将详细探讨这一过程。 首先,`...
本文将深入探讨如何统计缓存(尤其是Java对象)所占的内存大小,以及这对理解程序内存消耗的重要性。 首先,我们要知道Java对象的内存开销主要由三部分组成:对象头、实例数据和对齐填充。对象头包含对象的类型信息...
例如,`sun.misc.Unsafe`类(虽然非标准,但广泛使用)提供了访问内存的能力,包括获取对象大小。然而,需要注意的是,这个类在Java 9及以后的版本中被弃用,并且在某些JRE中可能不可用。 `SizeOfObject.java`可能...
总之,Java对象和数组的内存占用取决于JVM的配置、对象的字段、数组的元素类型和长度等因素。开启或关闭压缩选项会影响对象和数组引用的大小,进而影响整体的内存占用。对于内存优化和性能调优来说,了解这些细节至...
本文将深入探讨Java中的对象内存占用,以及如何使用"java-sizeof-0.0.4"工具来查看Java对象在内存中的大小。 在Java中,内存主要分为堆内存(Heap)和栈内存(Stack)。对象通常存储在堆内存中,而基本类型的变量和...
本篇文章将深入探讨Java中的对象、基础类型以及数据处理相关的工具类。 首先,让我们关注Java中的基础类型。Java有八种原始数据类型:byte、short、int、long、float、double、char和boolean。为了方便处理这些类型...
Java对象缓冲实现中间件是一种高效的数据存储和访问机制,它通过在内存中创建一个对象池来减少对硬盘或网络资源的频繁访问,从而提高应用程序的性能。这种中间件设计的核心理念是利用内存的高速访问特性,将常用或者...
计算机后端-Java-Java核心基础-第15章 面向对象07 21. 接口练习:比较对象大小.avi
接下来,我们将详细介绍如何精确地计算Java字符串所占用的内存空间。这里主要关注字符串对象本身的内存占用情况,而非其引用部分。 ##### Java字符串结构分析 在Java中,字符串(String)是一个不可变的对象,它主要...
4. **深/浅拷贝**:在计算对象大小时,需要区分深拷贝和浅拷贝。浅拷贝只复制对象本身,不包括引用的对象;深拷贝则会递归复制所有引用的对象,因此深拷贝的内存占用通常大于浅拷贝。 5. **垃圾收集与内存管理**:...
它基于集合交集和并集的大小来计算相似度,特别适用于处理包含多个元素的集合,例如词袋模型中的词汇项。在Java编程中,我们可以实现一个计算杰卡德相似度的函数,用于分析两个向量的相似性。 向量是数学中的一个...
这个主题主要涉及如何利用Java来减少图片文件的大小,包括静态图片(如JPEG、PNG)以及动态图片(如GIF)。下面我们将深入探讨相关的知识点。 首先,Java中的核心库`javax.imageio`提供了对图片读取、写入和处理的...
本项目专注于一个特定的需求,即“Java提取EXCEL图片重命名并改变像素大小”。这个功能对于那些需要批量处理Excel文件中的图像,比如统一调整格式、优化存储大小或适应不同展示环境的场景非常有用。下面我们将详细...
这个程序首先读取指定路径的图像,然后计算保持原图宽高比的新高度,接着创建一个新的`BufferedImage`对象用于存储缩放后的图像。最后,使用`Graphics2D`将原始图像绘制到新图像上,调整其大小,然后保存新的图像。...