Java程序计算对象所占内存的大小的方法
来源:互联网 发布:无钢圈内衣品牌 知乎 编辑:程序博客网 时间:2024/04/29 22:42
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();
}
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() + "字节");
}
}
- Java程序计算对象所占内存的大小的方法
- sizeof计算对象所占内存的大小详解
- JAVA——对象所占内存空间大小的计算
- C++对象所占内存的大小
- C# 能否获取一个对象所占内存的大小
- C# 能否获取一个对象所占内存的大小?
- [iOS]关于计算文字所占范围大小的方法
- 类所占内存的大小
- 空类所占内存的大小
- 空类所占内存的大小
- 空类所占内存的大小
- 空类所占内存的大小
- 内存对齐方式的总结 如何计算结构体所占内存的大小
- 内存对齐方式的总结 如何计算结构体所占内存的大小
- 计算对象所占的内存空间
- PHP计算程序运行所占内存方法
- struct对象在内存中所占的空间大小(内存对齐)
- 计算某个文件夹所占的磁盘空间大小
- 提高性能---java中优化程序应尽量要做到的
- websphere liberty 装配 部署
- PHPCMS广告模块详细分析——广告的生成
- mysql database中常用操作
- C#基础实践:引用与值类型
- Java程序计算对象所占内存的大小的方法
- 计数排序(Countsort)之Java实现
- 嵌入式 解决线程使用sleep或usleep等函数导致整个进程睡眠的问题
- corbarclient支持spring3.X
- PCB中的地线
- LeetCode Container With Most Water
- SQL Server中 DateDiff计算时间差
- 【mysql】表的创建以及基本操作
- BeagleBone Black 高清照片两张