一、打包和使用方法参考我之前的这篇文章,本文主要是更新了测量的类及方法,实际测试这个方法更准确。

https://www.cnblogs.com/yoyotl/p/8421287.html

二、新的测量类

//package net.sourceforge.sizeof;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.lang.instrument.Instrumentation;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.IdentityHashMap;
import java.util.Map; public class SizeOf {
private static OutputStream out = System.out;
private static Instrumentation inst;
private static long MIN_CLASS_SIZE_TO_LOG = 1048576L;
private static boolean SKIP_STATIC_FIELD = false;
private static boolean SKIP_FINAL_FIELD = false;
private static boolean SKIP_FLYWEIGHT_FIELD = false;
private static boolean debug = false;
private static String[] unit = {"b", "Kb", "Mb", "Gb", "Tb"}; public static void premain(String paramString, Instrumentation paramInstrumentation) {
inst = paramInstrumentation;
System.out.println("JAVAGENT: call premain instrumentation for class SizeOf");
} public static long sizeOf(Object paramObject) {
if (inst == null) {
throw new IllegalStateException("Instrumentation is null");
}
if ((SKIP_FLYWEIGHT_FIELD) && (isSharedFlyweight(paramObject))) {
return 0L;
}
return inst.getObjectSize(paramObject);
} public static String humanReadable(long paramLong) {
double d = paramLong;
int i = ;
for (i = ; (i < ) && (d >= 1024.0D); i++) {
d /= 1024.0D;
}
return d + unit[i];
} public static long deepSizeOf(Object paramObject) {
IdentityHashMap localIdentityHashMap = new IdentityHashMap();
return deepSizeOf(paramObject, localIdentityHashMap, );
} /**
* @deprecated
*/
public static long iterativeSizeOf(Object paramObject)
throws IllegalArgumentException, IllegalAccessException, IOException {
return deepSizeOf(paramObject);
} private static String indent(int paramInt) {
StringBuilder localStringBuilder = new StringBuilder();
for (int i = ; i < paramInt; i++) {
localStringBuilder.append(" ");
}
return localStringBuilder.toString();
} private static long deepSizeOf(Object paramObject, Map<Object, Object> paramMap, int paramInt) {
if (paramObject == null) {
if (debug) {
print("null\n");
}
return 0L;
}
long l = 0L;
if (paramMap.containsKey(paramObject)) {
if (debug) {
print("\n%s{ yet computed }\n", new Object[]{indent(paramInt)});
}
return 0L;
}
if (debug) {
print("\n%s{ %s\n", new Object[]{indent(paramInt), paramObject.getClass().getName()});
}
paramMap.put(paramObject, null);
l = sizeOf(paramObject);
if ((paramObject instanceof Object[])) {
int i = ;
for (Object localObject2 : (Object[]) paramObject) {
if (debug) {
print("%s [%d] = ", new Object[]{indent(paramInt), Integer.valueOf(i++)});
}
l += deepSizeOf(localObject2, paramMap, paramInt + );
}
} else {
Field[] arrayOfField = paramObject.getClass().getDeclaredFields();
for (Object localObject2 : arrayOfField) {
((Field) localObject2).setAccessible(true);
Object localObject3;
try {
localObject3 = ((Field) localObject2).get(paramObject);
} catch (IllegalArgumentException localIllegalArgumentException) {
throw new RuntimeException(localIllegalArgumentException);
} catch (IllegalAccessException localIllegalAccessException) {
throw new RuntimeException(localIllegalAccessException);
}
if (isComputable((Field) localObject2)) {
if (debug) {
print("%s %s = ", new Object[]{indent(paramInt), ((Field) localObject2).getName()});
}
l += deepSizeOf(localObject3, paramMap, paramInt + );
} else if (debug) {
print("%s %s = %s\n", new Object[]{indent(paramInt), ((Field) localObject2).getName(), localObject3.toString()});
}
}
}
if (debug) {
print("%s} size = %s\n", new Object[]{indent(paramInt), humanReadable(l)});
}
if ((MIN_CLASS_SIZE_TO_LOG > 0L) && (l >= MIN_CLASS_SIZE_TO_LOG)) {
print("Found big object: %s%s@%s size: %s\n", new Object[]{indent(paramInt), paramObject.getClass().getName(), Integer.valueOf(System.identityHashCode(paramObject)), humanReadable(l)});
}
return l;
} private static boolean isAPrimitiveType(Class paramClass) {
if (paramClass == Boolean.TYPE) {
return true;
}
if (paramClass == Character.TYPE) {
return true;
}
if (paramClass == Byte.TYPE) {
return true;
}
if (paramClass == Short.TYPE) {
return true;
}
if (paramClass == Integer.TYPE) {
return true;
}
if (paramClass == Long.TYPE) {
return true;
}
if (paramClass == Float.TYPE) {
return true;
}
if (paramClass == Double.TYPE) {
return true;
}
return paramClass == Void.TYPE;
} private static boolean isComputable(Field paramField) {
int i = paramField.getModifiers();
if (isAPrimitiveType(paramField.getType())) {
return false;
}
if ((SKIP_STATIC_FIELD) && (Modifier.isStatic(i))) {
return false;
}
return (!SKIP_FINAL_FIELD) || (!Modifier.isFinal(i));
} private static boolean isSharedFlyweight(Object paramObject) {
if ((paramObject instanceof Comparable)) {
if ((paramObject instanceof Enum)) {
return true;
}
if ((paramObject instanceof String)) {
return paramObject == ((String) paramObject).intern();
}
if ((paramObject instanceof Boolean)) {
return (paramObject == Boolean.TRUE) || (paramObject == Boolean.FALSE);
}
if ((paramObject instanceof Integer)) {
return paramObject == Integer.valueOf(((Integer) paramObject).intValue());
}
if ((paramObject instanceof Short)) {
return paramObject == Short.valueOf(((Short) paramObject).shortValue());
}
if ((paramObject instanceof Byte)) {
return paramObject == Byte.valueOf(((Byte) paramObject).byteValue());
}
if ((paramObject instanceof Long)) {
return paramObject == Long.valueOf(((Long) paramObject).longValue());
}
if ((paramObject instanceof Character)) {
return paramObject == Character.valueOf(((Character) paramObject).charValue());
}
}
return false;
} public static void setMinSizeToLog(long paramLong) {
MIN_CLASS_SIZE_TO_LOG = paramLong;
} public static void skipFinalField(boolean paramBoolean) {
SKIP_FINAL_FIELD = paramBoolean;
} public static void skipStaticField(boolean paramBoolean) {
SKIP_STATIC_FIELD = paramBoolean;
} public static void skipFlyweightObject(boolean paramBoolean) {
SKIP_FLYWEIGHT_FIELD = paramBoolean;
} private static void print(String paramString) {
try {
out.write(paramString.getBytes());
} catch (IOException localIOException) {
throw new RuntimeException(localIOException);
}
} private static void print(String paramString, Object... paramVarArgs) {
try {
out.write(String.format(paramString, paramVarArgs).getBytes());
} catch (IOException localIOException) {
throw new RuntimeException(localIOException);
}
} public static void setLogOutputStream(OutputStream paramOutputStream) {
if (paramOutputStream == null) {
throw new IllegalArgumentException("Can't use a null OutputStream");
}
out = paramOutputStream;
} public static void turnOnDebug() {
debug = true;
} public static void turnOffDebug() {
debug = false;
}
}

PS:反编译一个开源测试库并优化代码得到的新类,测试有效,希望对你有用。

Java对象的内存实际占用的更多相关文章

  1. java对象在内存的大小

    前言 一直以来,对java对象大小的概念停留在基础数据类型,比如byte占1字节,int占4字节,long占8字节等,但是一个对象包含的内存空间肯定不只有这些. 假设有类A和B,当new A()或者n ...

  2. Java对象的内存模型(一)

    前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...

  3. Java对象的内存布局

    对象的内存布局 平时用java编写程序,你了解java对象的内存布局么? 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域: 对象头 实例数据 对齐填充 对象头 对象头包括两部分信息: ...

  4. JVM总结-java对象的内存布局

    在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的 new 语句之外,我们还可以通过反射机制.Object.clone 方法.反序列化以及 Unsafe.allocateInstance ...

  5. Java对象的内存(一)

    前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...

  6. java对象在内存中的分配

    java对象在内存中的分配 http://blog.csdn.net/qq_30753945/article/details/54974899

  7. 10 Java 对象的内存布局

    Java 创建对象的方式 1:new 语句和反射机制创建.该方式会调用类的构造器,同时满足诸多约束.如果一个类没有构造器的话,Java 编译器会自动添加一个无参数的构造器.子类的构造器需要调用父类的构 ...

  8. Java对象的内存布局以及对象的访问定位

    一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机上长度分别为32bit和64bit)存储 ...

  9. 3 Java对象的内存布局以及对象的访问定位

    先来看看Java对象在内存中的布局   一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机 ...

随机推荐

  1. 【转载】和 Thrift 的一场美丽邂逅

    http://www.cnblogs.com/cyfonly/p/6059374.html 一. 与 Thrift 的初识 也许大多数人接触 Thrift 是从序列化开始的.每次搜索 “java序列化 ...

  2. python str,list,tuple转换

      1. str转listlist = list(str) 2. list转strstr= ''.join(list) 3. tuple list相互转换tuple=tuple(list)list=l ...

  3. windows下端口映射(端口转发)

    windows下端口映射(端口转发) 转载: https://blog.csdn.net/i1j2k3/article/details/70228043 本文是对网文的归纳整理,算不上原创,摸索过程亲 ...

  4. 2019最新最全HUSTOJ本地及云端服务器搭建(基于腾讯云服务器)

    在刚接触ACM的时候,对于那些在线测评的网站很感兴趣,就在网上搜索了一下,在Github上发现了一个有趣的项目,然后在 Github 上获取 了HUST OJ 的开源项目代码,根据网上的教程踩了无数的 ...

  5. js基础梳理-究竟什么是执行上下文栈(执行栈),执行上下文(可执行代码)?

    日常在群里讨论一些概念性的问题,比如变量提升,作用域和闭包相关问题的时候,经常会听一些大佬们给别人解释的时候说执行上下文,调用上下文巴拉巴拉,总有点似懂非懂,不明觉厉的感觉.今天,就对这两个概念梳理一 ...

  6. 利用ApiPost接口调试与文档生成工具,提升前、后端工作效率

    什么是ApiPost? 场景1: 对于我们后端程序员,常常会写一些接口(APIs),但是在前端尚未调用之前,我们必须先自己测试下这个接口是不是正确返回了预定结果.对于一个GET请求的接口还好,我们可以 ...

  7. 【Java】同步阻塞式(BIO)TCP通信

    TCP BIO 背景 网络编程的基本模型是Clien/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接 ...

  8. 安卓,网页控件,显示网页 Android, web controls, display web pages

    安卓,网页控件,显示网页Android, web controls, display web pages 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq ...

  9. 洛谷P1198 [JSOI2008]最大数(BZOJ.1012 )

    To 洛谷.1198 最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当 ...

  10. HDU.1536.S-Nim(博弈论 Nim)

    题目链接 \(Description\) 给定一个集合S,每次只能拿S中某个元素个数的石子.每组数据有多组询问,询问给出m堆石子个数,问先手是否必胜.有多组数据. 1. 首先对操作数组排个序,再预处理 ...