`
happyqing
  • 浏览: 3151646 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多

 

查看已用内存

System.out.println("--- Memory Usage:"); /*打印一行字符串---Memory Usage*/    
Runtime rt=Runtime.getRuntime( ); //获得系统的Runtime对象rt  
//打印总内存大小 //打印空闲内存大小 //打印已用内存大小 单位(字节)
System.out.println("Total Memory= " + rt.totalMemory()+       
             
" Free Memory = "+rt.freeMemory()+" Used Memory="+(rt.totalMemory()-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

分享到:
评论

相关推荐

    为什么Java程序占用的内存比实际分配的多

    很多人错误的认为运行Java程序时使用-Xmx和-Xms参数指定的是程序将会占用的内存,但是这实际上只是Java堆对象将会占用的内存。堆只是影响Java程序占用内存数量的一个因素。要更好的理解你的Java程序将会占用多大的...

    java源码包---java 源码 大量 实例

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    java源码包4

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    java源码包3

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    JAVA上百实例源码以及开源项目源代码

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    JAVA上百实例源码以及开源项目

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    [java]读书笔记整理:一切都是对象

    如果java让对象继续存在,那么靠什么才能防止这些对象填满内存空间,进而阻塞你的程序呢?这正是C++里可能发生的问题。这也是java神奇之处所在。Java有个“垃圾回收器”,用来监视用new创建的所有对象,并辨别哪些...

    面向对象程序设计

    (2)内存的可用空间,公共的大小(包括物流内存和虚拟内存) (3)当前进程数。 (4)该系统还应当获取当前的时间和日期从而可以统计出自开机以来上面几个检测分量出现的最大值和最小值。 求各位大神思路,用到...

    java源码包2

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    java 面试题 总结

    忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。 25、short s1 = 1; s1 =...

    超级有影响力霸气的Java面试题大全文档

    忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。 28、short s1 = 1; s1 =...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    因此,对象名(变量)实际上存放的是一个被实例化之后的对象所占有的内存区域 的指针。 例如: type objectName = new type ( [paramlist] ); 运算符 new 为对象分配内存空间 ,实例化一个对象 。new 调用对象的构造...

    Java范例开发大全 (源程序)

     实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12  实例5...

    JAVA面试题最全集

    请写一个java程序实现线程连接池功能? 44.给定一个C语言函数,要求实现在java类中进行调用。 45.如何获得数组的长度? 46.访问修饰符“public/private/protected/缺省的修饰符”的使用 47.用关键字final修饰一...

    Java范例开发大全(全书源程序)

    实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 关系运算符 13 实例7 逻辑...

    AIC的Java课程1-6章

    希望大家喜欢 &lt;br&gt;如果大家觉得好我继续发 &lt;br&gt;课程定位 “Java程序”课程覆盖SCJP认证所要求的知识点,是J2EE课程体系中的基础课程。本课程面向的学员应该具有基本的编程概念,能够编写简单的程序,并学习...

    java jdk实列宝典 光盘源代码

    12反射 是java程序开发的特征之一,允许java程序对自身进行检查,并能直接操作程序的内部属性; instanceof操作符,instanceof.java; 获取类的信息,ViewClassInfoJrame.java; 动态调用类的方法,CallMetod.java; ...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

Global site tag (gtag.js) - Google Analytics