详解Java对象创建的过程及内存布局
一、对象的内存布局
对象头
对象头主要保存对象自身的运行时数据和用于指定该对象属于哪个类的类型指针。
实例数据
保存对象的有效数据,例如对象的字段信息,其中包括从父类继承下来的。
对齐填充
对齐填充不是必须存在的,没有特别的含义,只起到一个占位符的作用。
二、对象的创建过程
实例化一个类的对象的过程是一个典型的递归过程。
在准备实例化一个类的对象前,首先准备实例化该类的父类,如果该类的父类还有父类,那么准备实例化该类的父类的父类,依次递归直到递归到Object类。
此时,首先实例化Object类,再依次对以下各类进行实例化,直到完成对目标类的实例化。具体而言,在实例化每个类时,都遵循如下顺序:
1.先依次执行实例变量初始化和实例代码块初始化
2.执行构造函数初始化。也就是说,编译器会将实例变量初始化和实例代码块初始化相关代码放到类的构造函数中去,并且这些代码会被放在对超类构造函数的调用语句之后,构造函数本身的代码之前。
三、对象访问定位
Java程序需要通过栈上的引用数据来操作堆上的具体对象。
对象的访问方式取决于虚拟机实现,目前主流的访问方式有使用句柄和直接指针两种。
句柄,可以理解为指向指针的指针,维护指向对象的指针变化,而对象的句柄本身不发生变化;指针,指向对象,代表对象的内存地址。
句柄
Java堆中划分出一块内存来作为句柄池,引用中存储对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。
对象类型数据是被虚拟机加载的类信息。
直接指针
直接指针方式中,并没有划分句柄池,引用中存储的直接就是对象地址。
四、参考
周志明,《深入理解Java虚拟机》
到此这篇关于详解Java对象创建的过程及内存布局的文章就介绍到这了,更多相关Java对象创建及内存布局内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
spring cloud 阿波罗 apollo 本地开发环境搭建过程
Apollo(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性2018-01-01java.net.ConnectException异常的正确解决方法(亲测有效!)
java.net.ConnectException异常是与网络相关的最常见的Java异常之一,建立从客户端应用程序到服务器的TCP连接时,我们可能会遇到它,这篇文章主要给大家介绍了关于java.net.ConnectException异常的正确解决方法,需要的朋友可以参考下2024-01-01springboot+hutool批量生成二维码压缩导出功能
这篇文章主要介绍了springboot+hutool批量生成二维码压缩导出功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-10-10
最新评论