侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Java 对象大小的计算

Java  /  管理员 发布于 3年前   489

         Java对象的大小

如何计算一个对象的大小呢?


    正常情况下,对象是分配在堆上。 然而,有些对象并不是分配在堆上。 如small thread-local 对象被分配在栈上或者寄存器中。 还有当前对象的状态也影响对象的大小。比如对象是否占用锁 或者 对象正在垃圾回收中。本章中讨论的是一般意义上的Java对象的大小。

1. 计算对象大小的规则
   1.1 在Hotspot中,对象主要包括三部分:

    对象头:

    基本类型 :
   
    对象引用类型 :占用四个字节
   
    padding : 浪费的空间  便于对象的分配

   1.2 基本类型的大小
      
       boolean 1字节
       byte    1字节

       char    2字节
       short   2字节
      
       int     4字节
       float   4字节

       long    8字节
       double  8字节

   1.3 对象头的大小
       记录一个对象的类 ID 和状态 (比如这个对象是否可达  锁状态) 。在Hopspot中, 正常的对象占头部需要占用8个字节。 数组占用12个字节(四个字节是数组的长度). 其它VM中都有相似的对象的头部。
  
   1.4 对象的大小
   Hotspot中,对象的大小必须是8的倍数。这意味着 :

   一个空对象占用8个字节
   一个仅有一个boolean值的对象 占用16个字节(8 + 1 + 7 )
   一个有8个boolean值的对象,也占用16个字节。(no padding)
  
   下一章介绍数组的大小。数组是是一种特殊的对象。在Java中,多维数组是数组的数组。例如二维数组,每一行都是独立的数组对象。
   
   boolean 数组需要每个元素都占用一个字节。尽管每一个字节都存储1Bit。 如果存储大量的位信息,可以使用BitSet。

在C语言中,二位数组是(或者任何多维数组)实际上一维数组。而在Java中,每个多维数组实际上一组内嵌数组。

考虑10*10的整型数组,out Array :12(头部) + 4 * 10 (指向10个一维数组的引用) + 4 (Padding ) = 56 个字节 

10个子数组 占用 (12 + 10 *4 + 4(Padding)) * 10 。 整个二维数组占用11 * 56 = 616个字节。 然而对于100个整型来说 ,只占用 4 * 10 * 10  = 400
  

   
      


  • 上一条:
    java线程和线程池的使用
    下一条:
    JavaScript常用验证脚本总结
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • java 正则表达式基础,实例学习资料收集大全 原创(0个评论)
    • java正则表达式彻底研究(0个评论)
    • java正则表达式验证函数(0个评论)
    • MVC、MVP和MVVM分别是什么(0个评论)
    • java 单例模式(饿汉模式与懒汉模式)(0个评论)
    • 近期文章
    • 在laravel框架中的5个HTTP客户端技巧分享(0个评论)
    • 在go语言中使用FFmpeg库实现PCM音频文件编码为mp3格式文件流程步骤(0个评论)
    • gopacket免安装Pcap实现驱动层流量抓包流程步骤(0个评论)
    • 在laravel项目中实现密码强度验证功能推荐扩展包:password-strength(0个评论)
    • 在go语言中用filepath.Match()函数以通配符模式匹配字符串示例(0个评论)
    • Laravel Response Classes 响应类使用优化浅析(0个评论)
    • mysql中sql_mode的各模式浅析(0个评论)
    • 百度文心一言今天发布,个人第一批内测体验记录,不好别打我(0个评论)
    • 嘿加密世界让我们谈谈在共识中将中本聪主流化(0个评论)
    • 在go语言中寻找两个切片或数组中的相同元素/共同点/交集并集示例代码(0个评论)
    • 近期评论
    • 博主 在

      2023年国务院办公厅春节放假通知:1月21日起休7天中评论 @ xiaoB 你只管努力,剩下的叫给天意;天若有情天亦老,..
    • xiaoB 在

      2023年国务院办公厅春节放假通知:1月21日起休7天中评论 会不会春节放假后又阳一次?..
    • BUG4 在

      你翻墙过吗?国内使用vpn翻墙可能会被网警抓,你需了解的事中评论 不是吧?..
    • 博主 在

      go语言+beego框架中获取get,post请求的所有参数中评论 @ t1  直接在router.go文件中配就ok..
    • Jade 在

      如何在MySQL查询中获得当月记录中评论 Dear zongscan.com team, We can skyroc..
    • 2016-11
    • 2018-03
    • 2020-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客