Java程序计算各种对象所占内存的大小的方法

标签: java 程序 计算 | 发表时间:2014-02-10 09:53 | 作者:happyqing
出处:http://www.iteye.com

 

System.out.println("--- Memory Usage:"); /*打印一行字符串---Memory Usage*/    
     Runtime rt=Runtime.getRuntime( ); //获得系统的Runtime对象rt    
     System.out.println("Total Memory= " + rt.totalMemory( )+//打印总内存大小    
             " Free Memory = "+rt.freeMemory( ));  //打印空闲内存大小

 

基类:

public abstract class SizeOf {      
     
    private final Runtime s_runtime = Runtime.getRuntime();      
     
    /**    
     *    
     * 子类负责覆盖该方法以提供被测试类的实例    
     *    
     * @return 被测试类的实例    
     */     
    protected abstract Object newInstance();      
     
    /**    
     *    
     * 计算实例的大小(字节数)    
     *    
     * @return 实例所占内存的字节数    
     * @throws Exception    
     */     
    public int size() throws Exception {      
     
        // 垃圾回收      
        runGC();      
     
        // 提供尽可能多(10万)的实例以使计算结果更精确      
        final int count = 100000;      
        Object[] objects = new Object[count];      
     
        // 实例化前堆已使用大小      
        long heap1 = usedMemory();      
        // 多实例化一个对象      
        for (int i = -1; i < count; ++i) {      
            Object object = null;      
     
            // 实例化对象      
            object = newInstance();      
     
            if (i >= 0) {      
                objects[i] = object;      
            } else {      
                // 释放第一个对象      
                object = null;      
                // 垃圾收集      
                runGC();      
                // 实例化之前堆已使用大小      
                heap1 = usedMemory();      
            }      
        }      
     
        runGC();      
        // 实例化之后堆已使用大小      
        long heap2 = usedMemory();      
        final int size = Math.round(((float) (heap2 - heap1)) / count);      
     
        // 释放内存      
        for (int i = 0; i < count; ++i) {      
            objects[i] = null;      
        }      
        objects = null;      
        return size;      
    }      
     
    private void runGC() throws Exception {      
        // 执行多次以使内存收集更有效      
        for (int r = 0; r < 4; ++r) {      
            _runGC();      
        }      
    }      
     
    private void _runGC() throws Exception {      
        long usedMem1 = usedMemory();      
        long usedMem2 = Long.MAX_VALUE;      
        for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++i) {      
            s_runtime.runFinalization();      
            s_runtime.gc();      
            Thread.currentThread().yield();      
            usedMem2 = usedMem1;      
            usedMem1 = usedMemory();      
        }      
    }      
     
    /**    
     *    
     * 堆中已使用内存    
     *    
     * @return 堆中已使用内存    
     */     
    private long usedMemory() {      
        return s_runtime.totalMemory() - s_runtime.freeMemory();      
    }      
}    

 

子类:

public class SizeOfObject extends SizeOf {      
     
    @Override     
    protected Object newInstance() {      
        return new Object();      
    }      
     
    public static void main(String[] args) throws Exception {      
        SizeOf sizeOf = new SizeOfObject();      
        System.out.println("所占内存:" + sizeOf.size() + "字节");      
    }      
} 

 

输出为:所占内存:8字节

利用序列化(Serializable)计算对象的大小
下面代码可以计算session的大小:
将session中的所有对象输出到文件中,文件的大小就是对象的大小.

try {      
    FileOutputStream f = new FileOutputStream("c:/sessionFiles");      
    ObjectOutputStream s = new ObjectOutputStream(f);      
    s.writeObject("session:");      
    HttpSession session = request.getSession(false);      
    Enumeration names = session.getAttributeNames();      
    while(names.hasMoreElements()){      
        s.writeObject(session.getAttribute((String) names.nextElement()));      
    }      
    s.flush();      
    s.close();      
    f.close();      
} catch (Exception e) {      
    e.printStackTrace();      
}   

 

也可以看看这个


java对象占内存大小

http://329937021.iteye.com/blog/547779



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java 程序 计算] 推荐:

Java程序计算各种对象所占内存的大小的方法

- - Java - 编程语言 - ITeye博客
System.out.println("--- Memory Usage:"); /*打印一行字符串---Memory Usage*/. Runtime rt=Runtime.getRuntime( ); //获得系统的Runtime对象rt. System.out.println("Total Memory= " + rt.totalMemory( )+//打印总内存大小.

java异步计算Future

- - 互联网 - ITeye博客
从jdk1.5开始我们可以利用Future来跟踪异步计算的结果. 在此之前主线程要想获得工作线程(异步计算线程)的结果是比较麻烦的事情,需要我们进行特殊的程序结构设计,比较繁琐而且容易出错. 有了Future我们就可以设计出比较优雅的异步计算程序结构模型:根据分而治之的思想,我们可以把异步计算的线程按照职责分为3类:.

Java计算日期和时间差

- - BlogJava_首页
这篇文章将使用两个例子计算两个日期的时间差.  计算两个Date之间的时间差,基本思路为把Date转换为ms(微秒),然后计算两个微秒时间差. 1s秒 = 1000ms毫秒 1min分种 = 60s秒 1hours小时 = 60min分钟 1day天 = 24hours小时.             //毫秒ms.

Java调用外部程序技巧

- d0ngd0ng - 我自然
前些天使用Java调用外部程序的时候,发现线程会堵塞在waitfor()方法. 如果直接在Shell中调用这个程序,程序会很快结束,不会僵死. 为什么会堵塞呢,原因是当调用exec(cmd)后,JVM会启动一个子进程,该进程会与JVM进程建立3个管道连接,标准输入,标准输出和标准错误流. 假设该程序不断在向标准输出流和标准错误流写数据,而JVM不读取,数据会暂时缓冲在Linux的缓冲区,缓冲区满后该程序将无法继续写数据,会僵死,所以Java程序就会僵死在waitfor(),永远无法结束.

通过Java程序获取Dynatrace数据

- - Taobao QA Team
“dynaTrace Ajax是一个详细的底层追踪工具,它不仅可以显示所有请求和文件在网络中传输的时间,还会记录浏览器Render、CPU消耗、JavaScript解析和运行情况等详细的信息,而这些也只是dynaTrace Ajax的冰山一角. showslow平台同样采集了dynatrace的数据,所以做为kelude平台前端页面测试组件,同样要支持dynatrace数据的获取,该代码由云晰同学编写维护:.

Java程序员常用工具集

- - BlogJava-庄周梦蝶
    我发现很多人没办法高效地解决问题的关键原因是不熟悉工具,不熟悉工具也还罢了,甚至还不知道怎么去找工具,这个问题就大条了. 我想列下我能想到的一个Java程序员会用到的常用工具. 1.IDE: Eclipse或者 IDEA,熟悉尽可能多的快捷键,《 Eclipse常见快捷键列表》. (1) Findbugs,在release之前进行一次静态代码检查是必须的.

Java系统程序员修炼之道

- - 博客 - 伯乐在线
从2002开始接触Java学会HelloWorld这么经典的程序到如今不知不觉已经十年啦,十年中亲耳听到过不少大牛的演讲,见到过项目中的神人在键盘上运指如飞的编程速度,当时就被震撼了. 当编程越来越成体力活,我们还能有自己的思想,还能修炼为Java系统级别的 程序员嘛. 学习与修炼以下知识与技能,帮你早日达成愿望.

Java程序挂掉的几种可能

- - Java译站
今天花了一整天在跟踪一个问题,每次感觉已经快找到原因的时候发现现象又变了,我觉得从中吸取的教训可以给大家分享一下. 为了重现这个现象,我写了一个简单的例子. 在本例中,先初始化了一个map,然后用一个无限循环将一些键值对插入到map里面:. 你可能也猜到了,这段代码编译执行后无法正常结束. 我会在终端中看到java.lang.OutOfMemoryError: GC overhead limit exceeded的异常信息.

准确的java程序性能测试

- - ITeye博客
原创文章,转载请指明出处: http://aub.iteye.com/blog/2124974 , 尊重他人即尊重自己. 1.避免垃圾回收对结果造成的误差. 方案一:JVM启动时使用-verbose:gc观察垃圾回收动作,确认整个测试期间垃圾回收根本不会执行. 方案二:运行足够的次数和时间,这样测试程序能够充分的反应出运行期间分配与垃圾回收的开销(推荐).

Java多线程程序的测试

- - 四火的唠叨
这个问题最初来自于一封公司内部的话题探讨邮件,再加上了一些我的理解. 首先,需要明确的是,用Java通常构建多线程安全的程序“非常”困难,如果还没有体会到“非常”的话,阅读《Java Concurrency in Practice》(中文名叫做《Java并发编程实战》,在我的 书单里面,我认为它基本是最好的系统介绍Java并发的书了)可能可以改变你的看法.