怎么计算java对象的大小?
java编程中处处离不开对象,是否了解对象在内存中结构?是否知道如何计算对象在内存中具体大小呢?本篇文章将想你介绍对象在内存中布局以及如何计算对象大小。
内存结构
在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。如下图所示:
(1)普通对象内存结构
(2)java数组对象内存结构
对象头(Header)
makrword: 用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别为4个字节和8个字节,官方称它为“MarkWord”,该部分将在下一节关于锁在对象中展现会详细介绍。
klass指针:对象头的另外一部分是klass,类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例.
length : 如果对象是java数组,那在对象头中还必须有一块用于记录数组长度的数据。所以会用4个字节的int来记录数组的长度。
实例数据区
实例数据部分是对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。无论是从父类继承下来的,还是在子类中定义的,都需要记录起来。
对齐填充
由于HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,这就要求当不为8字节整数倍时,就需要填充数据对齐填充。如此规定的原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问,详细原因介绍可以去查找相关资料。
基本数据类型的大小如下:
对于引用的大小如上对对象头中指针一样,不同位数JVM会有区别。在 32 位的 JVM 上,一个对象引用占用 4 个字节;在 64 位上,占用 8 个字节,开启指针压缩情况下占用4个字节。
实际工作中真正需要手动计算对象大小的场景应该很少,但是个人觉得做为基础知识每个Java开发人员都应该了解,另外:对自己写的代码大概占用多少内存,内存中是怎么布局的应该有一个直觉性的认识。
怎么计算java对象的大小?相关推荐
- 使用JOL工具计算Java对象的大小
注意:本文默认环境为 64 位操作系统,JDK 为 1.8,JVM 为 HotSpot. 工具 JOL全称为Java Object Layout,是用来分析JVM中对象布局的工具,可以在运行时计算某个 ...
- java统计空间占用_JVM —— Java 对象占用空间大小计算
引用类型(reference type: Integer)在 32 位系统上每一个占用 4bytes(即32bit, 才干管理 2^32=4G 的内存), 在 64 位系统上每一个占用 8bytes( ...
- JVM —— Java 对象占用空间大小计算
零. 为什么要知道 Java 对象占用空间大小 缓存的实现: 在设计 JVM 内缓存时(不是借助 Memcached. Redis 等), 需要知道缓存的对象是否会超过 JVM 最大堆限制, 如果会超 ...
- 计算 java_两种计算Java对象大小的方法(转)
原文:http://blog.csdn.net/iter_zc/article/details/41822719 另一篇类似文章:http://www.cnblogs.com/magialmoon/p ...
- 聊聊JVM(三)两种计算Java对象大小的方法
普通对象的结构如下,按64位机器的长度计算 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节 3. 数据区 4.Padding(内存对齐 ...
- instrumentation java_使用Instrumentation计算java对象大小
对象大小的计算 正如笔者看的这篇文章所描述的一样,当我们试图获取一个JVM中的对象实际占用的空间大小时.通常使用的方法是徒手计算,或者通过gc计算前后内存差来估计对象大小.而今天要介绍的方法--利用I ...
- 两种计算Java对象大小的方法
之前想研究一下unsafe类,碰巧在网上看到了这篇文章,觉得写得很好,就转载过来.原文出处是: http://blog.csdn.net/iter_zc/article/details/4182271 ...
- JVM概念之Java对象的大小与引用类型
2019独角兽企业重金招聘Python工程师标准>>> 本文来自和你在一起的博客,原文标题:<JVM调优总结(二)-一些概念>.本文总结了JVM概念中的Java对象的大小 ...
- 如何计算Java对象的大小
一个对象通常由头和内容组成.想要计算一个对象的大小,我们就需要分别计算头部的大小和内容的大小. 查看一个对象的大小 首先在pom文件中引入apache下面的lucene-core依赖,然后调用对应的s ...
最新文章
- XXL-REGISTRY v1.0.2 发布,分布式服务注册中心
- 使用pytorch搭建 RNN线性神经网络
- jQuery控制tab标签页
- 浅谈js本地图片预览
- [前台]---js重复上传一张图片两次,第二次失败的解决办法和思路
- css样式表中的样式覆盖顺序(转)
- Python基础-3内建函数 type() cmp()
- linux发送日志命令,linux:记录不同用户使用的命令发送到指定的目录中(可发送到日志服务器中)...
- arm hisiv100 linux,hisiv100交叉编译工具链安装
- tensorrt报错 [F] [TRT] Assertion failed: Unsupported SM.
- SQL Server对Xml字段的操作
- 利用jspx解决jsp后缀被限制拿shell
- python输入城市找省份_利用字典模拟省市区(县)的查询
- linux ps 主进程,Linux ps 查看进程
- 中创向心力:如何打造打造职业教育技术技能创新服务平台!
- 《算法图解》学习笔记(九):动态规划(附代码)
- 开源OceanBase如何与Prometheus与Grafana监控结合
- 半圆形进度条(html)
- 微信读书项目记录(1)
- 斯坦福博士退学,在 3 个领域改变世界,科技狂人马斯克的巅峰之路