如何精确地测量java对象的大小——底层instrumentAPI-Java开发Java经验技巧

如何精确地测量java对象的大小——底层instrumentAPI-Java开发Java经验技巧

ID:41468400

大小:68.47 KB

页数:8页

时间:2019-08-25

如何精确地测量java对象的大小——底层instrumentAPI-Java开发Java经验技巧_第1页
如何精确地测量java对象的大小——底层instrumentAPI-Java开发Java经验技巧_第2页
如何精确地测量java对象的大小——底层instrumentAPI-Java开发Java经验技巧_第3页
如何精确地测量java对象的大小——底层instrumentAPI-Java开发Java经验技巧_第4页
如何精确地测量java对象的大小——底层instrumentAPI-Java开发Java经验技巧_第5页
资源描述:

《如何精确地测量java对象的大小——底层instrumentAPI-Java开发Java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、如何精确地测量java对象的大小底层instrumentAPI原文出处:xieyu_zy关于java对象的大小测量,网上冇很多例子,大多数是申请一个对象后开始做GC,后对比前后的大小,不过这样,虽然说这样测量对象的大小是可行的,不过未必是完全准确的,因为过程屮包含对象木身的开销,也许你运气好,正好能碰上,差不多,不过这种测试往往显得十分的笨重,因为要写一堆代码才能测试一点点东西,而且只能在木地测试玩玩,要真正测试实际的系统的对象大小这样可就不行了,本文说说java-些比较偏底层的知识,如何测量对彖大小,java-Jt:实也是有提供方法的。注意:本文的内容仅仅针对于HotspotVM,如

2、果你以前不知道jvm的对象大小怎么测量,而又很想知道,跟我一步一步做--遍你就明白To首先,我们先写一•段大家可能不怎么写或者认为不可能的代码:一个类中,几个类型都是private类型,没有public方法,如何对这些属性进行读写操作,看似不可能哦,为什么,这违背了面向对象的封装,其实在必要的时候,留一道后面可以使得语言的生产力更加强大,对象的序列化不会因为没有public方法就无法保存成功吧,0K,我们简单写段代码开个头,逐步引入到怎么样去测试对象的大小,一下代码非常简单,相信不用我解释什么:importjava.1ang.reflect・Field;classNodeTestl{p

3、rivateinta二13;privateintb=21;}publicclassTestOOl{publicstaticvoidniQin(String[]args){NodeTestlnode=newNodeTestl();Field[]fields=NodeTestl.class・getDeclaredFields();for(Fieldfield:fields){field.setAccessible(true);try{inti=field・getlnt(node);field,setlnt(node,i*2);System,out.println(field.getlnt(

4、node));}catch(TilegalArgumentExceptione){e.printStackTrace();}catch(IllegalAccessExceptione){e.printStackTrace();}代码最基木的意思就是:实例化一个NodeTest1这个类的实例,然后取出两个属性,分别乘以2,然后再输岀,相信大家会认为这怎么可能,NodeTesll根木没有public方法,代码就在这里,将代码拷贝冋去运行下就OKT,0K,现在不说这些了,运行结果为:2642为什么可以取到,是每个属性都留了一道门,主要是为了自己或者外部接入的方便,相信看代码自己仔细的朋友,应

5、该知道门就在:field.sctAcccssiblc(truc);,代表这个域的访问被打开,好比是一道后门打开了,呵呵,上而的方法如果不设置这个,就直接报错。看似和对象大小没啥关系,不过这只是抛砖引玉,因为我们首先要拿到对象的属性,才能知道对象的大小,对象如果没有提供public方法我们也要知道它有哪些属性,所以我们后面多半会用到这段类似的代码哦!对象测量大小的方法关键为j3V3提供的(1・5过后才有):java.lang,instrument.Instrumentation,它捉供了丰富的对结构的等各方而的跟踪和对彖大小的测量的API(本文只阐述对象大小的测量方法),于是乎我心喜了,

6、不过比较恶心的是它是实例化类:sun.instrument.Intrumentationlmpl是sun开头的,这个鬼东西冇点不好搞,翻开源码构造方法是private类型,没有任何gctlnstancc的方法,写这个类干嘛?看来这个只能被JVM自己给初始化了,那么怎么将它自己初始化的东四取出来用呢,唯一能想到的就是agent代理,那么我们先抛开代理,首先来写一个简单的对象测量方法:〃步骤1(先创建一个用于测试对象大小的处理类):importjava・lang・instrument・Instrumentation;publicclassMySizeOf{privatestaticTnst

7、rumenlationinsl;/***这个方法必须写,在agent调用时会被启用*/publicstaticvoidpremain(StringagentArgs,InstrumentationinstP)inst二instP;〃用来测量java对象的大小(这里先理解这个大小是正确的,后而再深化)publicstaticlongsizeOf(Objecto){if(inst二二null){thrownewT11egalStateExcepti

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。