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

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. BZOJ1968 [Ahoi2005]COMMON 约数研究 数论

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1968 题意概括 求 ΣF(i)   (1<=i<=n)N<=1000000 F( ...

  2. BZOJ1180 [CROATIAN2009]OTOCI LCT

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1180 本题和BZOJ2843一样. BZOJ2843 极地旅行社 LCT 题意概括 有n座岛 每座 ...

  3. 【Java】 剑指offer(26) 树的子结构

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入两棵二叉树A和B,判断B是不是A的子结构. 思路 1)先对A树 ...

  4. (转)CASE WHEN 用法

    Case具有两种格式.简单Case函数和Case搜索函数. 简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END   ...

  5. 在Visual Studio代码中使用Flask

    Flask是一个用于Web应用程序的轻量级Python框架,它提供了URL路由和页面呈现的基础知识. Flask被称为“微”框架,因为它不直接提供表单验证,数据库抽象,身份验证等功能.这些功能由称为F ...

  6. UVA 129困难的串【DFS】

    题目链接 题目大意: 给出n,l:要求按特定格式输出由前l个大写字母构成的按字母表排列的第n个没有连续重复子串的字符串以及该字符串长度. 此题是一道dfs递归回溯的基础题,难点在于对当前字符串是否有连 ...

  7. Playmaker全面实践教程之playMaker编辑器

    Playmaker全面实践教程之playMaker编辑器 playMaker编辑器 playMaker编辑器是制作状态机的主要视图,如图1-23所示.只有熟悉此视图,读者才能更加快捷的使用Playma ...

  8. linux golang开发环境配置(离线方式)

    <获取开发工具>     到https://www.golangtc.com/download 下载安装包, 根据自己的系统选择合适的开发包,这里选择go.1.9.2.linux-amd6 ...

  9. 4513: [Sdoi2016]储能表 数位DP

    国际惯例的题面: 听说这题的正解是找什么规律,数位DP是暴力......好的,我就写暴力了QAQ.我们令f[i][la][lb][lc]表示二进制从高到低考虑位数为i(最低位为1),是否顶n上界,是否 ...

  10. 洛谷.1782.旅行商的背包(背包DP 单调队列)

    题目链接(卡常背包) 朴素的多重背包是: \(f[i][j] = \max\{ f[i-1][j-k*v[i]]+k*w[i] \}\),复杂度 \(O(nV*\sum num_i)\) 可以发现求\ ...