您的位置:首页 > 编程语言 > Java开发

如何看一段JAVA代码耗了多少内存

2017-08-06 22:26 991 查看
简单的方法,如下:


Runtime r = Runtime.getRuntime();
r.gc();
long startMem = r.freememory(); // 开始时的剩余内存
你的代码……
long orz = startMem - r.freememory(); // 剩余内存 现在


但这当然不够精确,尤其是“你的代码”足够多的时候。

那要怎么样做才能够精确呢?使用,java.lang.instrument ,当然,

首先,我们得会用这个instrument类,参考文章:https://www.ibm.com/developerworks/cn/java/j-lo-jse61/index.html

其次,已经有强人为我们写好了计算单个对象占用内存大小的api,地址:http://www.jroller.com/maxim/entry/again_about_determining_size_of

剩下的,思路就是:


在启动Java进程的时候把上文中写好的这个agent作为参数放进去,然后getObjectSize()方法可获取单个对象的大小,我们自己再通过反射逐个成员,对其进行getObjectSize(),然后所有的size求和。


最后,还要知道的一点知识是:

一个实例化的对象在内存中需要存储的信息包括:
对象的头部(对象的GC信息,hash值,类定义引用等)
对象的成员变量: 包括基本数据类型和引用。 如成员变量是一个引用, 引用了其他对象,被引用的对象内存另外计算。

对象大小分为:
自身的大小(Shadow heap size)
所引用的对象的大小(Retained heap size)。

基本数据类型大小如下:

type size(bits) bytes
boolean 8 1
byte 8 1
char 16 2
short 16 2
int 32 4
long 64 8
float 32 4
double 64 8

在32位的JVM上,一个对象引用占用4个字节;在64位上,占用8个字节。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: