在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小。

对象头

对象的头部至少有两个WORD,如果是数组的话,那么三个WORD,内容如下:

对象的HashCode,锁信息等

到对象类型数据的指针

数组的长度(如果是数组的话)

规则

首先,任何对象都是8字节对齐,属性按照[long,double]、[int,float]、[char,short]、[byte,boolean]、reference的顺序存放,举个例子:

publicclassTest {

bytea;

intb;

booleanc;

longd;

Object e;

}

如果这个对象的属性按照顺序存放的话,要占用的空间为:head(8) + a(1) + padding(3) + b(4) + c(1) + padding(7) + d(8) + e(4) + padding(4) = 40。但是按照这个规则得到:head(8) + d(8) + b(4) + a(1) + c(1) + padding(2) + e(4) + padding(4) = 32。可以看到节省了不少空间。

在涉及继承关系的时候有一个最基本的规则:首先存放父类中的成员,接着才是子类中的成员,举个例子:

classA {

longa;

intb;

intc;

}

classBextendsA {

longd;

}

这样存放的顺序及占用空间如下:head(8) + a(8) + b(4) + c(4) + d(8) = 32。那如果父类中的属性不够八个字节怎么办?这样就有了新的一条规则:父类中***一个成员与子类的***个成员的间隔如果不够4个字节,此时需要扩展到4 个字节的基本单位,举个例子:

classA {

bytea;

}

classBextendsA {

byteb;

}

那么此时占用的空间如下:head(8) + a(1) + padding(3) + b(1) + padding(3) = 16。显然这种方式比较浪费空间,那么就有了:如果子类的***个成员是double或者long,并且父类并没有用完8个字节,JVM会破坏规将较小的数 据填充到该空间,举个例子:

classA {

bytea;

}

classBextendsA {

longb;

shortc;

byted;

}

此时占用的空间如下:head(8) + a(1) + padding(3) + c(2) + d(1) + padding(1) + b(8) = 24。

【编辑推荐】

【责任编辑:wangxueyan TEL:(010)68476606】

点赞 0

java统计空间占用_如何计算Java对象占用了多少空间?相关推荐

  1. java计算年份_如何计算Java中2个日期之间的年份和年份

    您可以使用 Joda Time并使用月份和年份作为单位计算两个LocalDate值之间的时间段(这是您在此处获得的值). 示例代码: import org.joda.time.*; public cl ...

  2. java 共享软件 保护_【Java并发.3】对象的共享

    本章将介绍如何共享和发布对象,从而使他们能够安全地由多个线程同时访问.这两章合在一起就形成了构建线程安全类以及通过java.util.concurrent 类库来构建开发并发应用程序的重要基础. 3. ...

  3. java基础知识点_「Java面试题/知识点精华集」20000+字的Java基础知识篇(2020最新版) !

    " 本文已经收录进我的 79K Star 的 Java 开源项目 JavaGuide:https://github.com/Snailclimb/JavaGuide (「Java学习+面试指 ...

  4. java finalize逃脱_关于Java中的finalize()方法

    java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize(). (1).对象不一定会被回收. (2).垃圾回收不是析构函数. (3).垃圾回收只与内存有关. (4) ...

  5. java假死_分析java进程假死

    一.引言 1.编写目的 为了方便大家以后发现进程假死的时候能够正常的分析并且第一时间保留现场快照. 2.编写背景 最近服务器发现tomcat的应用会偶尔出现无法访问的情况.经过一段时间的观察最近又发现 ...

  6. 纯java分布式内存数据库_最新Java岗面试清单:分布式+Dubbo+线程+Redis+数据库+JVM+并发...

    最近可能有点闲的慌,没事就去找面试面经,整理了一波面试题.我大概是分成了Java基础.中级.高级,分布式,Spring架构,多线程,网络,MySQL,Redis缓存,JVM相关,调优,设计模式,算法与 ...

  7. java多线程编程_《java多线程编程实战指南》读书笔记 -- 基本概念

    展开 并发:多个线程操作相同资源,保证线程安全,合理使用资源 高并发:服务能同时处理多个请求,提高程序性能 测试上下文切换工具 Lmbench3 测量上下文切换时长 vmstat 测量上下文切换次数 ...

  8. java面向对象课件_《JAVA面向对象基础》PPT课件.ppt

    <<JAVA面向对象基础>PPT课件.ppt>由会员分享,可在线阅读,更多相关<<JAVA面向对象基础>PPT课件.ppt(68页珍藏版)>请在人人文库 ...

  9. java visualvm 内存_【Java线程与内存分析工具】VisualVM与MAT简明教程

    前言 本文将简要介绍Java线程与内存分析工具VisualVM和MAT的使用,进一步的学习可参考官网或工具帮助(例如MAT:Help -> Welcome -> Tutorials),并在 ...

最新文章

  1. jmeter基本测试步骤
  2. 【转】小周立波张冯喜引爆达人秀 小童星家居照大曝光
  3. 印度首富之女大婚,贫穷限制了我的想象……
  4. Golang 环境变量须知
  5. 【SPOJ】1043 Can you answer these queries III
  6. LoraWAN协议框架和应用实例解析
  7. MxCAD云图DWG转PDF
  8. html调用矢量小图标的方法,Web 前端矢量小图标的使用方法
  9. FPGA语法篇——Verilog 语法知识
  10. 拉绳位移传感器的原理
  11. windows安全中心(windows defender)对下载内容报毒解决方案
  12. 以昂扬的斗志,书写青春的热血
  13. php开发h5游戏,H5的canvas实现贪吃蛇小游戏
  14. 操作系统笔试面试笔记总结
  15. 如何有效练习英语口语
  16. 网络打印两个基本端口(LPD和9100)的相关知识
  17. 中值定理1----利用罗尔中值定理解题的一般步骤
  18. 过滤html标签 去除html标签
  19. 使用spring注解注入bean
  20. TCAM.TwinCAD.v3.2.006 for WinALL 1CD

热门文章

  1. logrotate 不生效
  2. MarkDown 的两种页内跳转方法!!!!!
  3. linux下mysql 启动命令
  4. 必应拼音输入法与搜狗拼音输入法体验性分析检测
  5. 1,机器学习应用概述
  6. No converter found capable of converting from type
  7. webpack模块化原理-ES module
  8. 图的存储结构之邻接表(详解)
  9. jmobile学习之路 ----检测屏幕宽度
  10. 深入Java集合学习系列:Hashtable的实现原理