如何计算java对象占用的内存
转载自:http://www.bitscn.com/pdb/java/200605/21194.html
Java有一个很好的地方就是java的垃圾收集机制,这个机制集成于jvm的,对程序员来说是隐藏且不透明的。这种情况下,如何得到某个对象消耗的内存呢?
曾经看到过有人用以下方法来计算:在生成该object的前后都调用java.lang.Runtime.freeMemory()方法,然后看两者之差即为该object消耗的内存量。
这种方法的代码是:
long totalMem = java.lang.Runtime.freeMemory();
Object myBigObject = null;
System.out.println("You just got rid of " + totalMem
- java.lang.Runtime.freeMemory());
这种想法是对的,但是实际上,jvm的freememory往往不能正确反应实际的free memory。比如在jvm要进行垃圾收集的时候,free memory就会缩小。而如果决定垃圾收集的时间发生在该object生成之后,而在第二次调用java.lang.Runtime.freeMemory()之前,那么就会错误地增加该object消耗的内存量。
在java专家By Tony Sintes的文章"Discover how much memory an object consumes " 里面提到了应该用Runtime.getRuntime().totalMemory();并且计算两次之差来得到消耗的内存量。
By Tony Sintes的源代码:
public class Memory {
private final static int _SIZE = 500;
public static void main( String [] args )
throws Exception {
Object[] array = new Object[_SIZE];
Runtime.getRuntime().gc();
long start = Runtime.getRuntime().totalMemory();
for (int i = 0; i < _SIZE; i++) {
array[i] = new Object();
}
Runtime.getRuntime().gc();
long end = Runtime.getRuntime().totalMemory();
long difference = ( start - end ) / _SIZE;
System.out.println( difference + " bytes used
per object on average" );
}
}
实际上,这种方法基本上正确了,但是By Tony Sintes疏忽了一点,就是仅仅Runtime.getRuntime().gc();并不能真正完成垃圾收集,也就是说实际上jvm的内存此时并不是稳定的。
所以,只有当内存不再发生大的变动,或者说已经稳定,我们才可能说垃圾收集已经完成。
如何才能真正确保基本完成了jvm的垃圾收集呢?实现这个功能的代码如下:
private static final Runtime s_runtime =
Runtime.getRuntime ();
private static long usedMemory ()
{
return s_runtime.totalMemory () -
s_runtime.freeMemory ();
}
private static void runGC () throws Exception
{
long usedMem1 = usedMemory (), 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 ();
}
}
如何计算java对象占用的内存相关推荐
- 如何计算Java对象所占内存的大小
摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型.锁原理 ...
- 解析一个Java对象占用多少内存空间
说明: alignment, 对齐, 比如8字节的数据类型long, 在内存中的起始地址必须是8的整数倍. padding, 补齐; 在对象所占据空间的末尾,如果有空白, 需要使用padding来补齐 ...
- java统计空间占用_如何计算Java对象占用了多少空间?
在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小. 对象头 对象的头部至少有两个WORD, ...
- 2020 idea 查看内存消耗_查看运行时某个java对象占用JVM大小及通过idea查看java的内存占用情况...
一.如果想看运行时某个java对象占用JVM内存大小,可以先将对象转换成字节类型,然后计算: List bizGroupRelatedEventInfos = bizEventVersionMappe ...
- 如何查看java对象所占内存大小
有时候我们需要对比看那种数据结构的Java对象占用的内存比较少,这时候我们就需要查看内存大小. 借助org.apache.lucene工具类 当一个对象有多个属性,需要计算整个对象的大小时,可以借助o ...
- java取得对象占用的内存大小
本文环境 win 10 jdk 1.8.0_241 IntelliJ 2019.1.3 一.通过Instrumentation获取内存 在java工程中添加如下代理类: package com.nin ...
- 如何计算java对象大小
背景 目前我们系统的业务代码中大量使用了LocalCache的方式做本地缓存,而且cache的maxSize通常设的比较大,比如10000.我们的业务系统中就使用了size为10000的15个本地缓存 ...
- java程序占用实际内存大小
一.java程序占用实际内存大小 1.1.java命令启动参数-Xms -Xmx的问题 启动命令如下:java -server -Xms128m -Xmx128m -jar ****. ...
- 1 OC 对象的本质(一个NSObject 对象占用的内存大小)
1 前言 目录 1 前言 2 一个NSObject占用多少内存 3 为什么呢 ? 4 如何在内存中看呢? OC 的面向对象都是基于C/C++ 的数据结构实现的 结构体 2 clang 命令转换成c++ ...
最新文章
- 剖析IntentService的运作机理
- 图解HTTP--笔记
- Qt程式异常崩溃处理技巧(Win)
- android -------- MVP+DataBinding 的使用
- 搬家,又一次和过往告别
- 格式化输入数字_Python格式化输出的三种方式
- 以普通用户启动的Vim如何保存需要root权限的文件
- Android 数据访问之External Storage 数据保存在sd卡 demo+笔记
- InfoPath 发布表单到SharePoint库报错
- Hadoop HDFS 的 Java API 操作方式
- Android 硬编码
- 敏感性分析数学建模方法(敏感性分析数学建模模型)
- activity劫持反劫持
- 哪个Linux可以运行国服lol,Linux wine国服LOL英雄联盟,完美运行!!
- 多张图片怎么合成一个pdf?
- 附加支付和统筹支付_医保附加支付是什么意思?
- 在Xcode中使用C++与Objective-C混编
- IV 12 MySQL+drbd+heartbeat
- Try-with-resources are not supported at language level ‘5‘
- 点线面数据异常分析,鱼骨图找原因