之前发过一个Java利用Instrumentation获取对象大小的博客,这次修复了一些Bug,应该是非常准确了,除了一种情况,那就是下面代码里面main方法里的情况:
/** * 因为要用到java.lang.instrument.Instrumentation, * 本代码需要打成jar包以javaagent运行,manifest.mf文件内容如下 Manifest-Version: 1.0 Premain-Class: com.teasp.mem.SizeOfAgent Boot-Class-Path: Can-Redefine-Classes: false * 运行方式:打包成sizeof.jar后, * 执行java -javaagent:sizeof.jar com.teasp.mem.SizeOfAgent */ public class SizeOfAgent { private static Map<Object, Object> visited = new IdentityHashMap<Object, Object>(); private static Instrumentation inst; /** initializes agent */ public static void premain(String agentArgs, Instrumentation instP) { inst = instP; } /** * Returns object size without member sub-objects. * @param o object to get size of * @return object size */ public static long sizeOf(Object o) { if(inst == null) { throw new IllegalStateException("Can not access instrumentation environment.\n" + "Please check if jar file containing SizeOfAgent class is \n" + "specified in the java's \"-javaagent\" command line argument."); } return inst.getObjectSize(o); } /** * Calculates full size of object iterating over * its hierarchy graph. * @param obj object to calculate size of * @return object size */ public static long fullSizeOf(Object obj) { // Map<Object, Object> visited = new IdentityHashMap<Object, Object>(); Stack<Object> stack = new Stack<Object>(); long result = internalSizeOf(obj, stack/*, visited*/); while (!stack.isEmpty()) { result += internalSizeOf(stack.pop(), stack/*, visited*/); } // visited.clear(); return result; } private static boolean skipObject(Object obj/*, Map<Object, Object> visited*/) { // if (obj instanceof String) { // // skip interned string // if (obj == ((String) obj).intern()) { // return true; // } // } return (obj == null) || visited.containsKey(obj); } @SuppressWarnings("rawtypes") private static long internalSizeOf(Object obj, Stack<Object> stack/*, Map<Object, Object> visited*/) { if (skipObject(obj/*, visited*/)) { return 0; } visited.put(obj, null); long result = 0; // get size of object + primitive variables + member pointers result += SizeOfAgent.sizeOf(obj); // process all array elements Class clazz = obj.getClass(); if (clazz.isArray()) { if(clazz.getName().length() != 2) {// skip primitive type array int length = Array.getLength(obj); for (int i = 0; i < length; i++) { stack.add(Array.get(obj, i)); } } return result; } // process all fields of the object while (clazz != null) { Field[] fields = clazz.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { if (!Modifier.isStatic(fields[i].getModifiers())) { if (fields[i].getType().isPrimitive()) { continue; // skip primitive fields } else { fields[i].setAccessible(true); try { // objects to be estimated are put to stack Object objectToAdd = fields[i].get(obj); if (objectToAdd != null) { stack.add(objectToAdd); } } catch (IllegalAccessException ex) { assert false; } } } } clazz = clazz.getSuperclass(); } return result; } public static void main(String[] args) throws Exception { Object a = new Object(); Object b = a; System.out.println(System.identityHashCode(a) + ":" + System.identityHashCode(b)); String stra = new String("abc"); String strb = new String("abc"); System.out.println("stra : " + fullSizeOf(stra)); //第一次计算时把"abc"这个常量池里面的字符串的字符数组给算进去了 System.out.println("strb : " + fullSizeOf(strb)); //第二次计算时就不会 } }
相关推荐
Java SE 6新特性:Instrumentation,利用 Java 代码,即 java.lang.instrument 做动态 Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrument 功能从本地代码中解放出来,使之可以用 Java 代码的方式解决...
注入javaagent使用Instrumentation测量Java对象的大小
②通过 Class 对象分别获取Constructor类对象、Method类对象 & Field 类对象 ③通过 Constructor类对象、Method类对象 & Field类对象分别获取类的构造函数、方法&属性的具体信息,并进行后续操作 2.3.2 java ...
opentelemetry-java-instrumentation 源码阅读
•• ••适用于Java的OpenTelemetry Instrumentation关于该项目提供了Java代理JAR,该Java代理JAR可以附加到任何Java 8+应用程序,并动态注入字节码以捕获来自许多流行的库和框架的遥测。 您可以采用多种格式导出...
A Java Instrumentation Framework.zip
基于 Java Instrumentation + Javaassist 的简单 RASP
This paper describes JSpy, a system for high-level instrumentation of Java bytecode and its use with JPaX, our system for runtime analysis of Java programs. JPaX monitors the execution of temporal ...
基于java Instrumentation技术的数据采集探针验证.pdf
java8流源码CS474 - 课程项目 团队成员 迈特雷伊·拉贾戈帕兰 雪莉·马修·乔治 概述 本项目的要求是: 一个检测程序,它采用一些 Java 应用程序的语法正确的源代码,并使用 Eclipse Java 抽象语法树 (AST) 解析器将...
这几天在物流大赛上也用了不少时间,所以对于android的单元测试没有太深入的研究,所以先写个基本入门吧!首先,我们来了解一下android的测试类的层次结构:可以看出android中的测试方法主要有AndroidTextCase和...
java动态编译java源文件,并利用Instrumentation实现重定义class
Instrumentation可以把测试包和目标测试应用加载到同一个进程中运行。既然各个控件和测试代码都运行在同一个进程中了,测试代码当然就可以调用这些控件的方法了,同时修改和验证这些控件的一些数据
Iocomp.Instrumentation.WF40.Common.dll,Iocomp.Instrumentation.WF40.Pro Iocomp.WF40.OPC
Qt5案例之利用QProcess获取计算机硬件信息,介绍利用QProcess获取计算机的CPU、主板、硬盘等电脑相关硬件信息。windows提供了“wmic”(Windows Management Instrumentation,Windows管理工具),提供了从命令行接口...
1 JAVA SE 1.1 深入JAVA API 1.1.1 Lang包 1.1.2 集合类 1.1.2.1.1 日期类Date 1.1.2.1.2 日历类Calendar 1.1.2.1.3 随机数类Random 1.1.2.1.4 向量类Vector 1.1.2.1.5 栈类Stack 1.1.2.1.6 哈希表类Hashtable ...
使用instrumentation创建测试用例示例代码
Product Description This title presents the general principles of instrumentation processes. It explains the theoretical analysis of physical phenomena used by standard sensors and transducers to ...
官方版本,亲测可用
参考博客 【Android中Hook Instrumentation 的实现】 http://blog.csdn.net/u012341052/article/details/71191409