`
happyqing
  • 浏览: 3183827 次
  • 性别: 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编程语言中,了解一个对象占用的内存大小对于优化程序性能、理解内存消耗以及防止内存泄漏至关重要。本文将深入探讨如何计算Java对象所占内存,并通过提供的代码示例进行详细解析。 首先,我们需要理解Java...

    统计缓存(java对象所占的内存)大小

    本文将深入探讨如何统计缓存(尤其是Java对象)所占的内存大小,以及这对理解程序内存消耗的重要性。 首先,我们要知道Java对象的内存开销主要由三部分组成:对象头、实例数据和对齐填充。对象头包含对象的类型信息...

    计算java对象大小

    2. **使用第三方库**:有一些开源库,如`Eclipse Memory Analyzer Tool (MAT)`,提供了分析Java堆内存的功能,包括计算对象大小。MAT可以提供详细的内存报告,显示每个对象及其引用链的大小。另一个例子是`Apache ...

    计算一个Java对象占用字节数的方法

    掌握这些基础知识可以帮助开发者更好地理解Java程序的内存消耗,从而在设计和优化时做出更明智的决策。例如,通过合理地组织数据结构和减少不必要的对象引用,可以显著降低内存使用量,进而提高应用程序的性能。同时...

    计算java对象的大小的方法

    - **JOL (Java Object Layout)**:由Azul Systems开发的轻量级库,通过反射和JNI技术来计算对象的精确大小。 6. **源码分析**:通过阅读JVM的源码,如OpenJDK,可以更深入地理解对象是如何在内存中布局的。 7. **...

    java 通过sizeOf计算一个对象的大小

    在Java编程语言中,了解一个对象的内存大小是很有用的,特别是在性能调优和内存管理方面。`sizeOf`通常是指用来计算对象在内存中占用空间的一种方法。本篇文章将探讨如何通过Java来实现这样的功能,以及相关知识点。...

    测试java对象占用内存大小的例子

    在Java编程语言中,了解一个对象占用的内存大小是非常重要的,尤其是在优化性能或者处理大量对象时。本示例主要探讨如何测试Java对象占用的内存大小,以便更好地理解内存使用情况。 首先,`SizeOf.java`可能是一个...

    java字符串内存计算

    在Java中,直接获取一个对象所占用的内存大小并非易事。常见的做法是在运行特定代码之前记录当前的内存状态,待代码执行完成后,触发垃圾回收机制,并再次记录内存状态。通过对比两次内存状态的变化,可以估算出代码...

    测量Java对象大小的demo

    本示例“测量Java对象大小的demo”提供了一种方法,通过使用Java的`java.lang.instrument`包来注入`javaagent`,进而利用`Instrumentation`接口测量Java对象的精确内存占用。下面我们将详细探讨这一过程。 首先,`...

    java-sizeof-0.0.4:一个查看java对象占用内存大小

    开发者可以在项目中引入这个JAR,然后调用其中的方法来计算对象的大小。通常,这类工具会利用反射机制,遍历对象的所有字段,包括嵌套的对象和数组,以计算总内存消耗。 3. `java-sizeof-0.0.4-sources.jar`:包含...

    java实现内存动态分配

    Java程序运行时,内存分为堆内存(Heap)和栈内存(Stack)。堆内存主要用来存储对象实例和数组,而栈内存主要存储基本类型变量和对象引用。 2. **堆内存分配** 堆内存是Java中的全局共享区域,用于存储所有的...

    计算对象占用内存空间ObjectSize-master.zip

    在Java中,对象的内存占用不仅仅是它的实例变量所占的空间,还包括对象头、对齐填充等其他因素。对象头通常包含指向方法区的引用(指向类元数据)和垃圾收集器用到的信息。如果对象是数组,还会有一个额外的元素...

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

    Java程序在运行过程中占用的内存通常比通过-Xmx和-Xms参数所设定的堆内存大小要多,这是由于Java程序的内存消耗不仅限于堆内存。以下是对各个影响因素的详细解析: 1. **对象(Objects)**:这是Java程序中最基本的...

    Java获取计算机CPU、内存等信息

    `getHeapMemoryUsage()`和`getNonHeapMemoryUsage()`方法分别返回堆和非堆内存的使用情况,`MemoryUsage`对象提供了获取各个阶段内存大小的方法:初始化大小(`getInit`)、当前使用大小(`getUsed`)、已分配大小(`...

    Java程序性能优化 让你的Java程序更快、更稳定

    综上所述,Java程序性能优化是一个全面且深入的过程,涉及代码编写、JVM配置、资源管理等多个层面。不断学习和实践这些技巧,你的Java程序将会在速度和稳定性上达到新的高度。通过阅读"Java程序性能优化 让你的Java...

    Java占用内存的研究.pdf

    总结而言,本文档提供了一个深入的分析,帮助读者理解在Java编程中,不同数据类型和结构所占用的内存大小。这不仅可以帮助开发者更好地优化应用程序的内存使用,避免内存泄漏,而且对性能调优也有非常重要的参考价值...

    Java内存机制学习和使用

    - **调优策略**:为了提高程序的性能和响应速度,开发人员可以通过调整JVM参数来优化Java堆内存的大小,如`-Xmx`(最大堆内存大小)和`-Xms`(初始堆内存大小)等。 #### 三、本机内存及其作用 除了Java堆内存之外...

    Java程序性能优化 让你的Java程序更快、更稳定附本书示例代码(清晰版)

    Java程序性能优化是每个开发人员都需要关注的重要领域,特别是在企业级应用中,高效稳定的Java程序能够显著提升用户体验,降低服务器资源消耗。这本书“Java程序性能优化 让你的Java程序更快、更稳定”提供了深入的...

    javamemory_JAVA内存监视器_java_

    为了监视Java程序的内存使用情况,我们可以使用各种工具和API。例如,Java内置的JConsole和VisualVM提供图形界面来实时查看和分析内存状态。此外,Java的`ManagementFactory`类提供了获取内存使用统计信息的接口,...

Global site tag (gtag.js) - Google Analytics