JVM对象占用内存计算

大家都知道,jvm中对象实例存储在堆中,对象的引用存储在栈中,而对象的元数据(类型数据)存储在方法区。在我们进行内存优化的过程中经常需要了解每个对象占用的内存大小。接下来我将介绍对象占用内存大小的计算方式。

Java的对象模型

java是面向对象的语言,每个对象都属于某个类。在HotSpot虚拟机中对象采用的是oop-klass模型。其实原理很简单:就是在方法区中生成一个Class类保存类信息(Klass),包含静态常量、静态方法、字节码、即时编译代码等元数据,而在堆中实例化该类的实例对象(oop),实例对象中保存了指向Class类的指针,这样便构成了oop-klass模型。这样做有一个好处就是:在实现多态时只需要在Class类中保存虚方法表来减少频繁的方法搜索,而实例对象无需保存虚方法表。

每个对象都有一个 mark work 头部,以及一个引用(klass pointer)指向Class类的信息。

  1. 在未开启 UseCompressedOops 的 64 位 JVM 上,对象头有 16 字节大小,即 8 字节的 mark word 和 8 字节的引用。
  2. 在开启 UseCompressedOops 的 64 位机器上,引用成了 4 字节,一共 12 字节。

java对象在内存中模型如下:
java对象内存模型(其中粉色和绿色区域并不代表实际内存)

Java对象内存占用

对象大小分为:

  1. 自身的大小(Shadow heap size)
  2. 所引用对象的大小(Retained heap size)
class MyClass {int a;Object object;
}

如上图例子所示:myClass 实例创建出来之后,在内存中所占的大小就是 myClass 自身大小(Shadow heap size)。包括类的头部大小以及一个int的大小和一个引用的大小。myClass 中object 成员变量是一个对象引用,这个被引用的对象也占一定大小。myClass 实例所维护的引用的对象所占的大小,称为myClass实例的Retained heap size。我们这里仅讨论如何计算对象自身的大小,引用对象大小的计算方式可依此类推。

java对象内存可分为:头部 + 数据 + 对齐字节
±-----------------±-----------------±----------------- ±--------------+
| mark word | klass pointer | data (opt) | padding |
±-----------------±-----------------±------------------±--------------+

(1)头部大小(mark word + klass pointer)

  1. 在未开启 UseCompressedOops 的 64 位 JVM 上,对象头有 16 字节大小,即 8 字节的 mark word 和8 字节的引用。
  2. 在开启 UseCompressedOops 的 64 位机器上,引用成了 4 字节,一共 12 字节。

(2)数据大小(data)
空对象不包含任何成员变量,其大小即对象头大小。若存在成员成员,为了内存紧凑,成员在内存中的排列和声明的顺序可能不一致,这样才能充分利用内存空间。这是因为在32位系统中,对象大小需要为4byte(32位)的整数倍,而在64位的系统中,对象需要为8byte(64位)的整数倍。如下例子:

class MyClass {byte a;int c;boolean d;long e;Object f;        
}

其内存布局为:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191105222832371.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE
值得一提的是,数组对象和普通对象存在一点小区别:数组多一个记录数组长度的 int 类型(4byte

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

绘图基础语法与常用参数

1 # -*- coding: utf-8 -*-2 3 ###############################################################################4 ####################### 正文代码 #######################5 #################################################################…

MyEclipse 皮肤、主题、背景色

第一步:打开myeclipse--->help--->install from site--->Add将路径粘贴在这里。等待安装颜色主题。https://raw.github.com/guari/eclipse-ui-theme/master/com.github.eclipseuitheme.themes.updatesite 第二步:http://eclipsecolorthemes.org…

RPC 远程过程调用协议

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携…

周鸿祎:创业前的积累很重要

摘要:虽然公司上市,也投资了很多公司,日前,在中国人民大学的演讲中,周鸿祎却称自己“从来不是一个成功人士,曾经是一个最大的失败者”。 360特供机还没露面,已经被周鸿祎通过微博炒得火热&#…

BZOJ 4710 [Jsoi2011]分特产 解题报告

4710 [Jsoi2011]分特产 题意 给定\(n\)个集合,每个集合有相同的\(a_i\)个元素,不同的集合的元素不同。将所有的元素分给\(m\)个不同位置,要求每个位置至少有一个元素,求分配方案数。 先考虑两个简单的问题 给定\(m\)个相同元素和\…

java接口调试思想

对于接口调试的理解:最近多次参与接口调试工作,一般情况都是获取对方接口文档,文档中有加密验证方式,根据加密验证方式开发,调用对应的接口。可以不可以简化这个流程那,至少减少一方的工作量。1、减少调用方…

SOA (面向服务的架构)

见:https://baike.baidu.com/item/SOA/2140650?fraladdin UDDI 解说参见:UDDI是什么 SOAP解说参见: SOAP:简单对象访问协议 面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称…

mysql中count(*)和count(1)和count(column)区别

在日常的mysql使用中,我们经常会看到SELECT COUNT(*)、SELECT COUNT(1)等查询语句,他们到底有什么区别呢?今天我就来总结下。 我们先从函数的含义说起: count() 统计满足查询条件的结果集的总行数(包含null),其中count…

第一天笔记

编程语言分类: 1. 机器语言:用二进制指令编程,本质是直接操作硬件。 优点:执行效率高 缺点:开发效率低,学习难度高 2.汇编语言:用英文标签代替二进制指令,本质也是直接操作硬件。…

索尼MOTO等压榨国内代工厂:员工宿舍像监狱

摘要:据调查报告披露,伟易达血汗工厂的压榨情况比起富士康、苹果等有过之而无不及,包括强迫工人超负荷工作、暴露于有害化学物质、住宿环境差、虐待员工、超低的工资等。如前面保罗克鲁格曼发表了《表扬廉价劳动》一文,N.D.克里斯…

[cerc2012][Gym100624B]20181013

转载于:https://www.cnblogs.com/KonjakJuruo/p/9809637.html

Nginx服务器证书部署-亚洲诚信

Nginx服务器证书部署发布时间:2018-01-17 16:15:25依赖建议l SSL卸载驱动。建议:openssl版本1.1.0f。l nginx版本Stable version:最新稳定版,生产环境上建议使用的版本。获取证书MPKI方式:1. 登录https://mpki.tru…

java transient关键字

transient是用在序列化中的。当我们序列化的过程中,如果我们不想序列化某个字段,那么我们就可以使用这个关键字,jvm就会在序列化的时候自动忽略这个字段的数值。 transient主要有两个用途: 1.保证数据的安全。在进行序列化时&…

UDDI

见:https://baike.baidu.com/item/UDDI/2901586?fraladdin UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。UDDI,英文为 "Universal Description, Discovery and Integration",可译为“通用描述、…

腾讯手机管家筹划“出海”

摘要:正筹划推进旗下手机安全产品出海揽客。6月22日,腾讯无线安全产品部副总经理胡振东在上海表示,腾讯手机管家已推出了安卓国际版,下决心进军国际市场。 腾讯(00700.HK)正筹划推进旗下手机安全产品出海揽客。6月22日&#xff0c…

用反卷积(Deconvnet)可视化理解卷积神经网络还有使用tensorboard

『cs231n』卷积神经网络的可视化与进一步理解 深度学习小白——卷积神经网络可视化(二) TensorBoard--TensorFlow可视化 原文地址:http://blog.csdn.net/hjimce/article/details/50544370 作者:hjimce 一、相关理论 本篇博文主要讲…

java线程实现及线程池的使用

Java线程实现 线程把处理器的调度和资源分配分开,是cpu的最小调度单位。多个线程可以共享进程的内存资源,又可以独立调度。java线程关键方法都是通过高效的本地方法实现的。Java线程的主要实现方式有三种:内核实现、用户实现、内核用户混合实…

SOAP:简单对象访问协议

见:https://baike.baidu.com/item/%E7%AE%80%E5%8D%95%E5%AF%B9%E8%B1%A1%E8%AE%BF%E9%97%AE%E5%8D%8F%E8%AE%AE/3841505?fraladdin&fromid4684413&fromtitleSOAP 简单对象访问协议 SOAP(简单对象访问协议)一般指简单对象访问协议 …

程序调试

对拍 $ Windows $ 下的对拍程序 借助 \(Windows\) 脚本echo off :loop r.exe > input.in coronas.exe <input.in > output.a std.exe <input.in > output.b fc output.a output.b if not errorlevel 1 goto loop 一直没有找到怎样能控制对拍次数,今天终于醒悟,可…

不怕烧钱怕翻车:雷军与马化腾现场“过招”

说起微信&#xff0c;很多时尚潮人都很熟悉。这款软件可以发送语音信息、可以在有无线网络的地方免费发送、甚至只需摇一摇就能找到在你附近的用户&#xff0c;这些方便、时尚、新颖的元素使微信受到了很多用户的喜爱&#xff0c;也夺得了大量的市场。其实&#xff0c;在微信发…