2 Java内存层面的对象认识

说明:此分析基于HotSpot虚拟机

1 对象的创建

Java对象的创建方式有三种:

  1. 通过 new创建
  2. 通过 反序列化创建
  3. 通过 复制创建

通过new方式的对象创建过程如下:

2 Java内存层面的对象认识

创建过程说明:

  1. 执行字节码遇到new指令时,首先将去检查这个指令的参数是否能在常量池中定位到 一个类的符号引用。
  2. 类的初始化过程在后续章节详细补充
  3. 给对象分配初始内存空间有两种方式:指针碰撞 和 空闲列表。
  4. 分配空间后,清空该段的【不包括对象头】值,保证对象属性的不设值就使用初始值
  5. 对象头信息包括:元数据信息、对象的哈希码、对象的GC分代年龄
  6. 执行构造函数,给属性初始化设置的值

2 对象的内存布局

对象存储的内容分类以及明细如下:

2 Java内存层面的对象认识

一、 关于对象头的补充说明

  1. 对象头,在字长为32位和64位的虚拟机中分别为32比特(4字节)64比特(8字节)。
  2. 对象头的类型指针:不一定所有对象都会存储这项信息,意味着访问对象所属的类不一定通过对象自身。
  3. 如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据。

二、 关于实例数据的补充说明

  1. 对象属性的存储顺序,受到虚拟机分配策略参数(-XX:FieldsAllocationStyle参数)和字段在Java源码中定义顺序的影响
  2. 默认的分配策略下:占据相同字节数的属性会排列在一起,满足该条件下,父类的属性排在前面。

三、 关于对齐填充的说明

  1. 不一定会存在,因为 对象的大小一定是8字节的整数倍,因此需要对齐填充这部分,充当占位符

在32位字长的虚拟机下,对象的内存分布情况如下:

2 Java内存层面的对象认识

对象头的MarkWord部分

2 Java内存层面的对象认识

注:MarkWord结构在《synchronized详解》会涉及

3 对象的访问定位

对象访问方式也是由虚拟机实现而定的,主流的访问方式主要有使用 句柄直接指针两种:

3.1句柄访问

2 Java内存层面的对象认识

说明:
句柄访问方式,Java堆中将可能会划分出一块内存来作为 句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象 实例数据类型数据各自具体的地址

3.2 直接指针访问

2 Java内存层面的对象认识

说明:
使用直接指针来访问最大的好处就是 速度更快,只需要一次定位就能找到实例数据,而句柄池则需要两次:(需要先定位句柄池,再定位实例数据)

Original: https://www.cnblogs.com/knowledgeispower/p/16708253.html
Author: 拿了桔子跑-范德依彪
Title: 2 Java内存层面的对象认识

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585078/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【phaser】HTML5 2d小游戏快速实现

    原文链接 前言 最近忙着看项目和写项目,在 github 上无意中发现了别人用 phaser 实现的2d小游戏,代码简单易懂,而且phaser框架本身就是非常的简单,非常适合想快速…

    Java 2023年6月7日
    076
  • 数据库事务与脏读幻读

    事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。 …

    Java 2023年6月13日
    070
  • Spring 中经典的 9 种设计模式,打死也要记住啊!

    来源:blog.csdn.net/caoxiaohong1005 转载: https://mp.weixin.qq.com/s/HdOKIp_rFgX-h65M0pRK9Q 1.简…

    Java 2023年5月30日
    066
  • shiro中常用的对象和方法

    一.配置类中常用的对象和方法 1.ShiroFilterFactoryBean()对象:通过创建的该对象调用setSecurityManager方法去关联DefaultWebSec…

    Java 2023年6月9日
    085
  • Jackson: java.util.LinkedHashMap cannot be cast to X

    Jackson是一个广泛使用的 Java 库,它允许我们方便地序列化/反序列化 JSON 或 XML。 有时,当我们尝试将 JSON 或 XML 反序列化为对象集合时,可能会遇到&…

    Java 2023年5月29日
    095
  • MSSQL·CONCAT函数的基础使用

    | 0.47分钟 | 752.8字符 | 1、应用场景 2、基础使用 3、声明与参考资料 | SCscHero | 2022/5/13 PM10:18 | 系列 | 已完成 每一个…

    Java 2023年6月5日
    058
  • 我怀疑这是IDEA的BUG,但是我翻遍全网没找到证据!

    你好呀,我是歪歪。 前几天有朋友给我发来这样的一个截图: 他说他不理解,为什么这样不报错。 我说我也不理解,把一个 boolean 类型赋值给 int 类型,怎么会不报错呢,并接着…

    Java 2023年6月5日
    069
  • Day9

    package array;public class ArrayDemo1 { //变量类型 变量的名字 = 变量的值 //数组类型 public static void main…

    Java 2023年6月5日
    044
  • 在Nginx 下运行 Laravel5.1 的配置

    一、nginx 的 vhost.conf 配置: server { listen 80; server_name sub.domain.com; set $root_path ‘/…

    Java 2023年5月30日
    080
  • 多态和其他的一些基础知识

    public class Demo06 {   public static void main(String[] args) {       System.out.println(…

    Java 2023年6月6日
    054
  • 用NginX+keepalived实现高可用的负载均衡

    经过前面的配置,如果主服务器的keepalived停止服务,从服务器会自动接管VIP对外服务;一旦主服务器的keepalived恢复,会重新接管VIP。 但这并不是我们需要的,我们…

    Java 2023年5月30日
    071
  • Vue自定义组件开发:使用v-model封装el-pagination组件

    1、前言 通过封装el-pagination组件开发自定义分页组件的类似文章网上已经有很多了,但看了一圈,总是不如意,于是决定还是自己动手搞一个。 2、背景 利用el-pagina…

    Java 2023年6月14日
    070
  • 部署solr服务

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 一、S orl单机部署 准备:solr5.5、tomcat8.5、jdk1.8 2.复制./solr-5.5.0/s…

    Java 2023年6月5日
    088
  • InnoDB学习(一)之BufferPool

    我们知道InnoDB数据库的数据是持久化在磁盘上的,而磁盘的IO速度很慢,如果每次数据库访问都直接访问磁盘,显然严重影响数据库的性能。为了提升数据库的访问性能,InnoDB为数据库…

    Java 2023年6月8日
    071
  • Activemq消息持久化

    官方文档: http://activemq.apache.org/persistence.html ActiveMq持久化相关配置:/usr/local/apache-active…

    Java 2023年5月29日
    060
  • LeetCode剑指Offer刷题总结(五)

    限制: 1 <= n < 2^31< code><!–=–> 数字范围较大,暴力会超时 class Solution { public in…

    Java 2023年6月7日
    061
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球