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

Posted 不如来编码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果看一段JAVA代码耗了多少内存相关的知识,希望对你有一定的参考价值。

简单的方法,如下:

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

















以上是关于如果看一段JAVA代码耗了多少内存的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 面试题

Java == 和 equals 区别

Java内存管理与反射机制

如何用Java编写一段代码引发内存泄露

java踩坑记之双花括号初始化实例导致内存泄露

java踩坑记之双花括号初始化实例导致内存泄露