是不是经常通过jvisualvm.exe来观察堆对象占用内存的变化?是不是在想oracle公司为啥不提供计算java对象大小的方法呢?
在企业开发中,前后台传递数据,如果数据比较大,进行持久化传递将会造成对象无法被虚拟机回收,进而导致内存泄漏,但一般是由于对象不较大引起的,因此需要对这些对象进行处理。google查询了一些资料,研究和整理如下:
1、利用序列化方法,这个经测试时比较接近的;
2、根据对象的大小进行估值;
3、使用虚拟机提供的函数,动态的,有时准确,有时不准确;
4、通过反射获取对象的大小,理论比较好,但没实现;
5、通过代理的方法来得到
下边主要说下序列化和虚拟机函数的方法。
序列化时通常把一个对象序列化到一个字节buffer里,那么就可以获得这个buffer的字节数。今天,在工作中,突软想到这样做太浪费空间,看了Java的ObjectOutputStream这个类的源码,发现也可以如下做,只计数,不产生字节转移,那么就不会耗费内存空间了。
public final class SizeCalculator {
public static int calcSize(java.io.Serializable o) {
int ret = 0;
class DumbOutputStream extends OutputStream {
int count = 0;
public void write(int b) throws IOException {
count++; // 只计数,不产生字节转移
}
}
DumbOutputStream buf = new DumbOutputStream();
ObjectOutputStream os = null;
try {
os = new ObjectOutputStream(buf);
os.writeObject(o);
ret = buf.count;
} catch (IOException e) {
// No need handle this exception
e.printStackTrace();
ret = -1;
} finally {
try {
os.close();
} catch (Exception e) {
}
}
return ret;
}
public static void main(String[] args){
System.err.println(calcSize(1));
}
}
原文链接:http://www.linuxidc.com/Linux/2010-01/24222.htm
2、通过获取new对象前和后 Runtime.getRuntime().totalMemory( )计算它们的差值,还是有参考价值的,至于有的说先让虚拟机回收,这个不可行,因为虚拟机执行回收是自动的,并不能直接调用虚拟机进行对象回收的。
分享到:
相关推荐
NULL 博文链接:https://sdfx.iteye.com/blog/2201116
主要介绍了计算一个Java对象占用字节数的方法,较为详细的分析了Java中各类对象所占用的字节数,需要的朋友可以参考下
注入javaagent使用Instrumentation测量Java对象的大小
NULL 博文链接:https://treemanfm.iteye.com/blog/2038954
NULL 博文链接:https://312256159-qq-com.iteye.com/blog/1582196
JAVA对象所占内存大小计算例子,博文地址:http://blog.csdn.net/u012787710/article/details/53164226
有效测量出 java 对象 内存 大小 可供缓存等计算
统计缓存大小(查看java对象所占的内存大小).
NULL 博文链接:https://spice.iteye.com/blog/1104340
NULL 博文链接:https://langyu.iteye.com/blog/1167581
测试java对象占用内存大小的例子,可以测试常用的类型
【小知识】第4期_Java对象大小怎么算
计算机后端-Java-Java核心基础-第15章 面向对象07 21. 接口练习:比较对象大小.avi
java中的栈(深层了解java虚拟机对对象的内存分布)
java-sizeof-0.0.4:一个查看java对象占用内存大小
java实现使用javolution完成数据接收过程中大小端转换的问题
命令行: java -XX:+PrintCommandLineFlags -version 查看jvm默认参数 分别是 -XX:+UseCompressedOops 和 -XX:+UseCompressedClassPointers 这2个参数都是默认开启(+代表开启,-代表关闭) UseCompressedOops:普通...
一个固定大小的,高效的对象池。主要用于对象池。 a fixed and high efficency object pool
对象大小 java-op-db connection-pool-test 连接池测试,包含高性能HikariCP,提供强大的监控和扩展功能druid MyBatis-demo MyBatis 测试 http-client-demo retrofit-test resume-parse Apache httpclient 测试 ...