Java中对象在内存中的大小、分配等问题
Java创建一个对象的过程
- 是否对象指向的类已经加载到内存了
- 如果没有加载,就要经过load、linking(verification、preparation、resolution)、initializing把类加载进内存中。
- 为对象分配内存空间、成员变量赋默认值
- 执行构造方法
- 成员变量赋指定值
- 执行构造方法语句
对象在内存中的存储布局(这里指在64位的JVM中)
普通对象
- 对象头:
- markwork 8个字节
- ClassPointer指针 JVM默认开启了 -XX:userCompressedClassPoniters参数,把ClassPointer指针从8个字节压缩到4个字节
- 实例数据
- 引用类型 JVM默认开启了 -XX:userCompressedOops参数,把原本普通引用类型指针从8个字节压缩到4个字节
- Padding对齐,将对象大小对齐到8的倍数
数组
- 对象头:
- markword 8个字节
- ClassPointer指针 (如上)
- 数组大小 4个字节
- 数组数据
- Padding 对齐到8个字节
markword具体包括什么

- 上图中指的是在32位JVM虚拟机中,在64为JVM虚拟机中hashcode占了31位,另外有25位没用过,有一位是没用的,其他都一样
- hashcode只有在对象调用了hashcode方法才会计算出hashCode,并把值存入里面。另外需要注意的是,在调用hashCode之后,该对象就不能进入偏向锁,因为偏向锁中需要记录线程ID,和线程重入次数(Epoch),但是他们位置被hashCode占了
- JVM中默认GC年龄最大为15,是因为如果所示,分代年龄只有4位,最大表示15。
对象如何定位
通过句柄池

使用句柄池最大的好处是reference存储的是稳定的句柄池地址,在因为GC之后对象被移动了只需要改变句柄池中指向实例数据的地址。
通过直接指针

使用直接指针访问的好处是速度更快,节省了一次指针定位的时间开销,就虚拟机HotSpot而言,它主要使用第二种方式进行对象访问。但是当对象因为GC而被移动位置后,所用指向这个对象的引用都要改变引用地址。
Java中对象在内存中的大小、分配等问题的更多相关文章
- JVM中java实例对象在内存中的布局
普通的Java对象实例 和 Java数组实例.Java数组实例的对象头多了一个数组的长度.Java虚拟机可以通过普通java对象的元数据来确定java对象的大小,但是从数组的元数据中却无法确定数组的 ...
- java对象在内存中的结构
在HotspotJVM中,32位机器下,Integer对象的大小是int的几倍? 我们都知道在java语言规范已经规定了int的大小是4个字节,那么Integer对象的大小是多少呢?要知道一个对象的大 ...
- java对象在内存中的结构(HotSpot虚拟机)
一.对象的内存布局 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 从上面的这张图里面可以 ...
- java对象在内存中的分配
java对象在内存中的分配 http://blog.csdn.net/qq_30753945/article/details/54974899
- Java中对象的内存分配机制
一.内存划分 Java把内存划分为两种,一种是栈内存,另一种是堆内存. 1.栈内存 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配.当在一段代码块定义一个变量时,Java就在栈 ...
- JVM中对象的内存布局与访问定位
一.对象的内存布局 已主流的HotSpot虚拟机来说, 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header).实例数据(Instance Data)和对齐填 ...
- JVM中,对象在内存中的布局
在hotSpot虚拟机中,对象在内存中的布局可以分成对象头.实例数据.对齐填充三部分. 对象头:主要包括: 1.对象自身的运行行元数据,比如哈希码.GC分代年龄.锁状态标志等,这部分长度在32位虚拟机 ...
- JVM运行时数据区及对象在内存中初始化的过程
JVM运行时数据区 Java虚拟机所管理的内存区域,也称为运行时数据区,分为以下几个运行时数据区,如图所示 程序计数器:当前程序所执行字节码的行号指示器 程序计数器(Program Counter R ...
- JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式
相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...
随机推荐
- deployer服务器端的配置
虽然说是无侵入的部署工具,但是还是需要我们来做一些微小的配置的,因为出于安全考虑,我们一般不会开发 root 用户的 SSH 登录,而是使用其它用户,比如 Ubuntu 默认的 ubuntu 用户.我 ...
- elastic后台运行
nohup./bin/elasticsearch&
- Chrome FeHelper 插件下载地址
方便大家下载 下载可用,本人亲自测试 下载地址: 地址链接
- 基于gin的golang web开发:模型绑定
在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参 ...
- Kubernetes Controller详解
运行容器化应用是Kubernetes最重要的核心功能.为满足不同的业务需要,Kubernetes提供了多种Controller,主要包括Deployment.DaemonSet.Job.CronJob ...
- WebService安全机制的思考与实践
近来因业务需要,需要研究webservice,于是便有这篇文章:SpringBoot整合Apache-CXF实践 一.WebService是什么? WebService是一个平台独立的.低耦合的.自包 ...
- requests库响应消息体的四种格式
1.r.text 文本响应内容,返回字符串类型,获取网页html时用: 2.r.content 字节响应内容,返回字节类型,下载图片或者文件时用: 3.r.json json解码响应内容,返回字典 ...
- Java学习的第六天
1.今天学习了各种运算符, 还有选择结构,循环结构 2.今天学习没有遇到困难. 3.明天学习数组和第三章的开头一部分.
- Fira Code字体安装与配置
俗话说,工欲善其事,必先利其器.算法固然重要,但真正实践也很重要. 一个字体的好看程度,直接决定了写代码和看代码的心情.比如这样: 代码1: #include <iostream> #in ...
- CSS之background——背景与渐变练习题
1.单选题 将背景的绘制区域规定到内容框,应使用background-clip属性中的哪个属性值? A content-box B border-box C padding-box D none-bo ...