首页 > 系统相关 >2 Java内存层面的对象认识

2 Java内存层面的对象认识

时间:2022-09-19 17:02:22浏览次数:78  
标签:Java 层面 对象 句柄 虚拟机 访问 内存

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

1 对象的创建

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

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

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

创建过程说明:

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

2 对象的内存布局

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

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

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

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

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

三、关于对齐填充的说明

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

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

3 对象的访问定位

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

3.1句柄访问

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

3.2 直接指针访问

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

标签:Java,层面,对象,句柄,虚拟机,访问,内存
From: https://www.cnblogs.com/knowledgeispower/p/16708253.html

相关文章

  • javascript 对象的细节
    对象的集中声明方式//方式一:letstu={ name:'小明',age:'17',study:function(){console.log(this.name+'爱学习')}}//调用方式:stu.name;stu......
  • JAVA接口组成更新与方法引用
    JAVA接口组成更新与方法引用接口组成接口组成更新概述接口的组成常量publicstaticfinal(可以省略)抽象方法publicabstract(可以省略)默认方法(java8......
  • java入门
      成功了编译是javac加那个文件名Hello.java   这个是代码......
  • java毕业生就业管理系统 高校毕业生就业服务平台 就业管理系统 高校就业统计系统 java
    ......
  • 力扣92(java&python)-反转链表Ⅱ(中等)
    题目:给你单链表的头指针head和两个整数 left和right,其中 left<=right。请你反转从位置left到位置right的链表节点,返回反转后的链表。示例1:输入:head=......
  • VBA中使用JAVASCRIPT
    PrivateSubCommandButton1_Click()DimjsstrDimsbAsStringDimoSCAsObjectDimiAsIntegerSetoSC=CreateObjectx86("MSScriptControl.ScriptControl")'......
  • Javaweb学习笔记第九弹
    MyBatis案例--环境准备1、依据之前在Navicat建立数据表的方法,新建立一个数据表2、将数据表的相关内容表现在Java文件的实例上:即成员变量和set、get成员方法3、new一个测......
  • Java的 static关键字
    通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法   声明为static的方法有以下几条限制: · 它们仅能调用其他的static 方法。 · 它们只......
  • Javascript_DOM操作
    Javascript_DOM操作一、关于Javascript与DOM1.JavaScriptJavaScript简称JS,是一种解释型脚本语言。JavaScript是一种轻量级编程语言。JavaScript是可插入HTML页面的编......
  • Java学习单例式设计
    单例设计模式:1.所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例2.如何实现?饿汉式vs懒汉式3.区分饿汉式和懒汉......