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对象的内存开销主要由三部分组成:对象头、实例数据和对齐填充。对象头包含对象的类型信息...
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编程中,不同数据类型和结构所占用的内存大小。这不仅可以帮助开发者更好地优化应用程序的内存使用,避免内存泄漏,而且对性能调优也有非常重要的参考价值...
- **调优策略**:为了提高程序的性能和响应速度,开发人员可以通过调整JVM参数来优化Java堆内存的大小,如`-Xmx`(最大堆内存大小)和`-Xms`(初始堆内存大小)等。 #### 三、本机内存及其作用 除了Java堆内存之外...
Java程序性能优化是每个开发人员都需要关注的重要领域,特别是在企业级应用中,高效稳定的Java程序能够显著提升用户体验,降低服务器资源消耗。这本书“Java程序性能优化 让你的Java程序更快、更稳定”提供了深入的...
为了监视Java程序的内存使用情况,我们可以使用各种工具和API。例如,Java内置的JConsole和VisualVM提供图形界面来实时查看和分析内存状态。此外,Java的`ManagementFactory`类提供了获取内存使用统计信息的接口,...