查看已用内存
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对象的内存开销主要由三部分组成:对象头、实例数据和对齐填充。对象头包含对象的类型信息...
2. **使用第三方库**:有一些开源库,如`Eclipse Memory Analyzer Tool (MAT)`,提供了分析Java堆内存的功能,包括计算对象大小。MAT可以提供详细的内存报告,显示每个对象及其引用链的大小。另一个例子是`Apache ...
掌握这些基础知识可以帮助开发者更好地理解Java程序的内存消耗,从而在设计和优化时做出更明智的决策。例如,通过合理地组织数据结构和减少不必要的对象引用,可以显著降低内存使用量,进而提高应用程序的性能。同时...
- **JOL (Java Object Layout)**:由Azul Systems开发的轻量级库,通过反射和JNI技术来计算对象的精确大小。 6. **源码分析**:通过阅读JVM的源码,如OpenJDK,可以更深入地理解对象是如何在内存中布局的。 7. **...
在Java编程语言中,了解一个对象的内存大小是很有用的,特别是在性能调优和内存管理方面。`sizeOf`通常是指用来计算对象在内存中占用空间的一种方法。本篇文章将探讨如何通过Java来实现这样的功能,以及相关知识点。...
在Java编程语言中,了解一个对象占用的内存大小是非常重要的,尤其是在优化性能或者处理大量对象时。本示例主要探讨如何测试Java对象占用的内存大小,以便更好地理解内存使用情况。 首先,`SizeOf.java`可能是一个...
在Java中,直接获取一个对象所占用的内存大小并非易事。常见的做法是在运行特定代码之前记录当前的内存状态,待代码执行完成后,触发垃圾回收机制,并再次记录内存状态。通过对比两次内存状态的变化,可以估算出代码...
本示例“测量Java对象大小的demo”提供了一种方法,通过使用Java的`java.lang.instrument`包来注入`javaagent`,进而利用`Instrumentation`接口测量Java对象的精确内存占用。下面我们将详细探讨这一过程。 首先,`...
开发者可以在项目中引入这个JAR,然后调用其中的方法来计算对象的大小。通常,这类工具会利用反射机制,遍历对象的所有字段,包括嵌套的对象和数组,以计算总内存消耗。 3. `java-sizeof-0.0.4-sources.jar`:包含...
`getHeapMemoryUsage()`和`getNonHeapMemoryUsage()`方法分别返回堆和非堆内存的使用情况,`MemoryUsage`对象提供了获取各个阶段内存大小的方法:初始化大小(`getInit`)、当前使用大小(`getUsed`)、已分配大小(`...
Java程序运行时,内存分为堆内存(Heap)和栈内存(Stack)。堆内存主要用来存储对象实例和数组,而栈内存主要存储基本类型变量和对象引用。 2. **堆内存分配** 堆内存是Java中的全局共享区域,用于存储所有的...
在Java中,对象的内存占用不仅仅是它的实例变量所占的空间,还包括对象头、对齐填充等其他因素。对象头通常包含指向方法区的引用(指向类元数据)和垃圾收集器用到的信息。如果对象是数组,还会有一个额外的元素...
Java程序在运行过程中占用的内存通常比通过-Xmx和-Xms参数所设定的堆内存大小要多,这是由于Java程序的内存消耗不仅限于堆内存。以下是对各个影响因素的详细解析: 1. **对象(Objects)**:这是Java程序中最基本的...
综上所述,Java程序性能优化是一个全面且深入的过程,涉及代码编写、JVM配置、资源管理等多个层面。不断学习和实践这些技巧,你的Java程序将会在速度和稳定性上达到新的高度。通过阅读"Java程序性能优化 让你的Java...
总结而言,本文档提供了一个深入的分析,帮助读者理解在Java编程中,不同数据类型和结构所占用的内存大小。这不仅可以帮助开发者更好地优化应用程序的内存使用,避免内存泄漏,而且对性能调优也有非常重要的参考价值...
Java程序性能优化是每个开发人员都需要关注的重要领域,特别是在企业级应用中,高效稳定的Java程序能够显著提升用户体验,降低服务器资源消耗。这本书“Java程序性能优化 让你的Java程序更快、更稳定”提供了深入的...
- **调优策略**:为了提高程序的性能和响应速度,开发人员可以通过调整JVM参数来优化Java堆内存的大小,如`-Xmx`(最大堆内存大小)和`-Xms`(初始堆内存大小)等。 #### 三、本机内存及其作用 除了Java堆内存之外...
为了监视Java程序的内存使用情况,我们可以使用各种工具和API。例如,Java内置的JConsole和VisualVM提供图形界面来实时查看和分析内存状态。此外,Java的`ManagementFactory`类提供了获取内存使用统计信息的接口,...