java 内存大小_java 如何查看全局变量占用内存大小

本文介绍了一种通过Java程序计算对象内存占用的方法,包括创建基类`SizeOf`,子类覆盖`newInstance()`来实例化目标类,并通过垃圾回收和堆内存使用量的差值来估算对象大小。此外,还提到了使用序列化来计算对象大小的方式,通过将对象写入文件并读取文件大小来获取对象的序列化后大小。这种方法可用于理解对象在内存中的占用情况。
摘要由CSDN通过智能技术生成

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();

}

}

子类:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值