研究一下JAVA的SizeOf

引用外部类实现JAVA的SizeOf

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

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

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

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

简单的测试

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

System.out.println(RamUsageEstimator.sizeOf(new Object()));

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

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

Object存储内容

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

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

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

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

import com.carrotsearch.sizeof.RamUsageEstimator;

public class SizeOfTest {
public static void main(String[] args) {
System.out.println(RamUsageEstimator.sizeOf(new MemTest()));
}
} 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的内存实在太复杂了,方法区,栈内存,特别是常量池又分为了好几种。。。了解的不够透彻,陷入了好几次圈圈中,查了好多资料才了解,因此决定也发个博客回馈一下。

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

JAVA使用SizeOf的更多相关文章

  1. 关于java中sizeof的问题

    因为java没有提供现成的函数去计算对象的内存空间,不过可以用大量产生某个对象然后计算平均值的方法近似获得该对象占用的内存. 虽然这种方法不是很准,但是也在一定程度上计算出来了对象所占用的内存空间,下 ...

  2. Java为什么会引入及如何使用Unsafe

    综述 sun.misc.Unsafe至少从2004年Java1.4开始就存在于Java中了.在Java9中,为了提高JVM的可维护性,Unsafe和许多其他的东西一起都被作为内部使用类隐藏起来了.但是 ...

  3. Java 基础知识总结 (一、标识符)

    一.Identifiers: 标识符 Names of class,method and variable 用于类名.方法名.变量名 Begin with character,'_' or '$' 标 ...

  4. Java编程思想学习(二) 操作符

    1. 对象“赋值”:对一个对象进行操作时,我们真正操作的是对对象的引用.所以倘若“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一个地方.(引用于对象之间存在关联,但这种关联可以被改 ...

  5. 操作符 Thinking in Java 第三章

    3.1 更简单的打印语句 3.2 使用Java操作符 3.3 优先级 *int类型+String类型  直接转换为String类型 3.4 赋值 1. *引用=引用  两个引用指向同一个对象,所以操作 ...

  6. Java编程思想 (1~10)

    [注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第一章 对象导论 1.万物皆对象2.程序就是对象的集合3.每个对象都是由其它对象所构成 ...

  7. Java语言与C++语言的差异总结

    Java的设计者曾说过,设计这门语言的灵感主要来自于C++. 世上先有C++,然后才有Java,整个Java语言的发展历史就是一部对C++的填坑史.所以在Java语言学习过程中,将其与C++语言对比是 ...

  8. [Java学习笔记]Java Tips

    1.Java没有sizeof关键字 , volatile是java关键字.详情见:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166. ...

  9. 《Java编程思想第四版完整中文高清版.pdf》-笔记

    D.2.1 安插自己的测试代码 插入下述“显式”计时代码,对程序进行评测: long start = System.currentTimeMillis(); // 要计时的运算代码放在这儿 long ...

随机推荐

  1. Dart SDK All In One

    Dart SDK All In One Dart SDK archive https://dart.dev/tools/sdk/archive https://dart.dev/get-dart Th ...

  2. 高阶类 & HOC & anonymous class extends

    高阶类 & HOC & anonymous class extends js 匿名 class extends / mix-ins / 多继承 高阶函数 HOF, 接收一个 funct ...

  3. Jamstack Conf 2020

    Jamstack Conf 2020 Jamstack Conf Virtual https://jamstackconf.com/virtual/ Conf Schedule https://jam ...

  4. 调整是为了更好的上涨,牛市下的SPC空投来了!

    2021年刚过没几天,比特币就开启了牛市的旅程,BTC涨到4万美元,ETH涨到1300多美元,BGV也涨到了621.05美元,牛市已然来袭. 虽然从近两日,比特币带领着主流币进行了一波调整,但是只涨不 ...

  5. Baccarat凭什么能成为DeFi后时代火爆新趋势?

    在各币种经历涨涨跌跌以后,DeFi后时代已然来临.那么,当前DeFi市场中哪个项目更被市场生态建设者看好呢?毫无疑问,Baccarat会成为最被看好的DeFi项目. Baccarat采用了独特的共识算 ...

  6. Masterboxan INC是你靠近财富的最佳选择

    Masterboxan INC万事达资产管理有限公司(公司编号:20151264097)是一家国际性资产管理公司,主要提供外汇.证券.投资管理和财富管理等金融服务,其在投资方面一直倡导组合型投资构建稳 ...

  7. PAUL ADAMS ARCHITECT:费城东北区的房地产市场逆势而行

    根据Zillow.com的房产数据,大费城地区前三季度成交房产的平均价格为27.2万美元,较去年同期增长了13.4%,为10年同期最高.即使如此,27.2万的均价与纽约相比依然相距甚远,其中尤其是费城 ...

  8. Java中Singleton的三种实现方式解析

    一.什么是Singleton? <设计模式>的作者.Eclipse和 Junit 的开发者 Erich Gamma 在它的理论体系中将 Singleton 定义为仅仅被实例化一次的类.在当 ...

  9. Java 开源办公开发平台 O2OA V5.4.0 发布 | 设计元素搜索功能上线

    O2OA V5.4.0版本此次更新的设计元素搜索功能,可以让用户在海量的脚本.页面.表单.视图等信息中迅速锁定有价值的信息,以便提高用户获取信息的效率.拥有此搜索功能后,在开发过程中,可以加速定位脚本 ...

  10. 如何让别人访问我的电脑的vue项目

    步骤: 1.关闭防火墙. 2.修改build/webpack.dev.conf.js中的"const HOST = process.env.HOST"为"const HO ...