zoukankan      html  css  js  c++  java
  • 如何看一段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个字节。

  • 相关阅读:
    TYVJ1061 Mobile Service
    TYVJ1061 Mobile Service
    KMP 模板
    poj 3254 Corn Field
    poj 3254 Corn Field
    洛谷1279 字串距离
    poj 1041 John's trip——欧拉回路字典序输出
    bzoj 3033 太鼓达人——欧拉图搜索
    bzoj 2503 相框——思路
    bzoj 2935 [Poi1999]原始生物——欧拉回路思路!
  • 原文地址:https://www.cnblogs.com/luminji/p/7296265.html
Copyright © 2011-2022 走看看