`

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( ));  //打印空闲内存大小 

基类:

Java代码
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();   
    }   
}  


子类:

Java代码
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() + "字节");   
    }   
}  

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中的所有对象输出到文件中,文件的大小就是对象的大小.

Java代码
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获取计算机CPU、内存等信息

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

    java实现内存动态分配

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

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

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

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

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

    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