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的使用,对 ...
随机推荐
- spring3.X版本知识点
一.SpringMVC重点注解 @Controller 1.@Controller 与 @Component 实际应用中作用等价. 2.和Struct一样,也是单例,意味着被多个请求线程共享, ...
- UI自动化执行时报Parent suite setup failed: SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 81报错的问题解决
持续集成在执行UI时报错:Parent suite setup failed: SessionNotCreatedException: Message: session not created: Th ...
- 正则表达式小应用之对xml格式字符串每个字段加双引号
通过Python对接口进行自动化后需要把xml格式的报文放到LoadRunner上进行压力测试,在pyCharm控制台打印出报文后,把报文放到LoadRunner中做了格式调整后,每个字段需要添加双引 ...
- 关于cookie与本地 存储的区别的问题。
关于cookie与本地 存储的区别的问题. 1. cookie在浏览器和服务器间来回传递.而sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存. 2. coo ...
- STM32入门系列-启动文件介绍
在启动文件内部使用的都是汇编语言,这个文件的作用是负责执行微控制器从"复位"到"开始执行 main 函数"中间这段启动时间所必须进行的工作.它完成的具体工作有: ...
- python gunicorn详解
Gunicorn是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP Server.和大多数的web框架兼容,并具有实现简单,轻量级,高性能等特点. gunicorn 安装 ...
- MapStruct 解了对象映射的毒
前言 MVC模式是目前主流项目的标准开发模式,这种模式下框架的分层结构清晰,主要分为Controller,Service,Dao.分层的结构下,各层之间的数据传输要求就会存在差异,我们不能用一个对象来 ...
- 【SpringBoot】13. logback日志记录
logback日志记录 Spring Boot 1.5.19.RELEASE 1.导入相关jar包 在spring-boot-starter-web 中已经包含 2.添加logback.xml配置文件 ...
- 面试 之 nginx,负载,动静分离
大家先看这个逻辑图 为什么我们要这样去架构我们的一个项目呢? 这样做的话,动态请求要先访问 A,A 转发访问 B,再由 B 返回结果给 A,A 最后又将结果返回给客户端这样是不是很麻烦? 最初开发的时 ...
- 谈谈synchronized
为什么要用synchronized关键字: synchronized是java的一种内部锁,是一种排他锁,通常也被称为悲观锁,它能够保障原子性,可见性,有序性. 当多个线程去调用同一个方法的时候,如果 ...