JAVA使用SizeOf

JAVA使用SizeOf

研究一下JAVA的SizeOf

引用外部类实现JAVA的SizeOf

JAVA本身是没有SizeOf的,因此我们需要去MavenRepository中下载JAR包(也可以使用maven等),因为这里只是做一个简单测试,就直接下载了JAR包。

点击jar下载,最新的版本也是2015年,算是比较老了。

下载成功后导入自己的JAVA项目,具体怎么导入网上有很多教程,就不赘述了。

可以看到我这里已经引用成功了,import后可以直接使用这些类了。

简单的测试

接下来来做一些简单的测试,看看这个类提供的sizeOf方法是否准确。

System.out.println(RamUsageEstimator.sizeOf(newObject()));

在控制台我们可以看到输出的结果是16。

可能还有人不清楚为什么会是16,这边给出一个链接,可以学习一下,个人觉得还是挺有帮助的。

Object存储内容

Integer等也都可以测试一下,结果还是很正确的。

那比较重要的就是数组和对象中再包含对象的,能否还是比较精确呢?

我们先来写一个简单的对象。

先给出一些例子,大家想想是为什么。

importcom.carrotsearch.sizeof.RamUsageEstimator;

public class SizeOfTest{

    public static void main(String[] args){                System.out.println(RamUsageEstimator.sizeOf(newMemTest())); 

    }

}

class MemTest{Integer a =12;}

结果是32,其实挺好解释的,MemTest本身和Object对象一样,占用12字节,a这个引用在指针压缩后占用4字节,加上a的16,自然是32。

我们把Integer改成int,结果答案还是16。

再加上一个int b,就变成了24。这是因为指针对齐。

如果你刚才有仔细去研究那个链接的话,你会看到Object本来应该占12个字节的,只是为了对齐变成了16。加上一个int的4字节,刚好是16。但我们改成Integer a;发现结果也是16。难道a不应该是8个字节的地址的引用吗?可以去了解一下指针压缩,默认是开启的,因此占用四个字节。

这样就可以解释的通了,再多做几次测试,加上各种各样的对象,也是这样的,符合我们计算出来的值。

再测试一种比较有意思的情况:

这种情况显示的是40。

这种情况却是56。

这是因为Java在处理Integer时使用了一个缓存,其中缓存了-128到127之间的数字对应的Integer对象。

看来源码应该不是简单的相加。(还没来得及研究源码)

这里插一个链接:https://blog.csdn.net/weixin_35204634/article/details/113451805?utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.control&dist_request_id=1328741.39129.16169961773027181&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromMachineLearnPai2~default-1.control

对研究JAVA内存结构很有帮助。

研究数组的情况

接下来来研究一下数组的测试是否准确,数组占用空间之前应用RunTime下提供的jvm内存判断的工具测试过,但那种方法不太准确,只能通过加大数组中元素个数来测试一个JAVA对象占用空间(所以Object一个对象占16字节我是测试过的!感兴趣的人可以看这个网址https://blog.csdn.net/ithomer/article/details/7310008)。同时还得出了结论,int[2][1024*1024]占用的内存比int[1024*1024][2]要小得多,这个也很好理解,JAVA的二维数组其实就是以数组为元素的数组,数组中自然有描述的一些东西,数组越多自然占用空间越大。

其实一维数组的情况不难,一维数组就相当于一个对象头+一片数组数据空间。

这里要注意:数组的对象头是这样的,MarkWord占用8字节,Class Point占用4字节,Length 数组占用4字节。

比如int[1]就是8+4+4+4,再对齐,就是24,测试发现相符。

那二维数组呢,我们先理论分析一下,以int[2][2]为例,先从二维的角度来看,对象头应该是16个字节,两个一维的指针一共8字节,两个一维数组各自如上占用24字节。也就是16+8+48=72字节,验证一下,果不其然。

总结

对这个SizeOf的测试就到此为止啦,主要是精确度的测试,结合网上查到的资料,精确度应该还行。

JAVA的内存实在太复杂了,方法区,栈内存,特别是常量池又分为了好几种。。。了解的不够透彻,陷入了好几次圈圈中,查了好多资料才了解,因此决定也发个简书回馈一下。

之后准备测试一下比较复杂的情况下的精确度和效率。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • IT 1. LeetCode力扣:搜索旋转排序数组 Java编写2021-04-02(33. 搜索旋转排序数组)[...
    幸福大黑鸭阅读 119评论 0 0
  • JVM 1:JVM基础知识 什么是JVM 常见的JVM 2:ClassFileFormat 3:类编译-加载-初始...
    皮皮魏阅读 225评论 0 0
  • 写在前面: 犹豫了一下,不知道该不该发这么多。毕竟题目虽全,但是其实很多人看了不到一半,估计就会默默的收藏保存,等...
    Yt_cc阅读 14,644评论 1 6
  • 1.new 、 delete 、 malloc 、 free 关系 delete 会调用对象的析构函数 , 和 n...
    可不期诺Cappuccino阅读 858评论 0 0
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 1,712评论 0 4