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

xiaoxiao2021-02-28  60

简单的方法,如下:

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个字节。

转载请注明原文地址: https://www.6miu.com/read-65514.html

最新回复(0)