您的位置:首页 > 编程语言 > Java开发

计算Java对象在内存中占用空间

2017-01-12 18:08 573 查看
1).对象占用空间计算原理:http://www.cnblogs.com/magialmoon/p/3757767.html

2).计算复合对象(即对象中引用其他对象):http://yueyemaitian.iteye.com/blog/2033046

3).ehcache包中提供了三种计算单个对象大小的方法:http://www.blogjava.net/DLevin/archive/2013/11/01/405822.html

由于2中的代码只能打包运行(因为其中用到的Instrumentation实例需要javaagent注入),为了贴合web项目实际需求,将代码做了微小修改

package com.kting.huawei.base.commons.util;

import java.lang.instrument.Instrumentation;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashSet;
import java.util.Set;

import net.sf.ehcache.pool.sizeof.ReflectionSizeOf;

/**
* 对象占用字节大小工具类
*
* @author tianmai.fh
* @date 2014-03-18 11:29
*/
public class SizeOfObject {
static Instrumentation inst;

public static void premain(String args, Instrumentation instP) {
inst = instP;
}

/**
* 直接计算当前对象占用空间大小,包括当前类及超类的基本类型实例字段大小、

* 引用类型实例字段引用大小、实例基本类型数组总占用空间、实例引用类型数组引用本身占用空间大小;

* 但是不包括超类继承下来的和当前类声明的实例引用字段的对象本身的大小、实例引用数组引用的对象本身的大小

*
* @param obj
* @return
*/
// public static long sizeOf(Object obj) {
// return inst.getObjectSize(obj);
// }

private static long sizeOf(Object obj) {
return new ReflectionSizeOf().sizeOf(obj);
}
/**
* 递归计算当前对象占用空间总大小,包括当前类和超类的实例字段大小以及实例字段引用对象大小
*
* @param objP
* @return
* @throws IllegalAccessException
*/
public static long fullSizeOf(Object objP) throws IllegalAccessException {
Set
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: