JVM12_StringTable、对象的实例化、对象的内存布局 、对象访问的两种方式、对象头信息

本文主要是介绍JVM12_StringTable、对象的实例化、对象的内存布局 、对象访问的两种方式、对象头信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

字符串常量池

为什么要调整,从永久代放到堆空间?

其实就是因为字符串常量池在永久代中,回收效率不高,而开发中会产生大量的字符串,这样就会导致永久代内存不足。放在堆中,能及时回收内存
在这里插入图片描述

静态变量

首先,new出来的东西没有疑问,都是放到对空间中的,
JDK中静态变量的变化,只是指的静态变量的引用存放的位置,JDK6是在永久代,JDK7和8放到了堆空间中

jhsdb.exe是在JDK9时才出现的,监控进程的工具
在这里插入图片描述
静态变量和映射的Class对象都放在了堆中

方法区的垃圾回收行为

对于方法区的回收行为,记住两点:
1、java虚拟机规范,对方法区的垃圾回收要求不高,可以不进行回收
2、如果要回收垃圾,主要是两方面:常量池中废弃的常量和不再使用的类,常量的回收简单,但是对于类的回收则不太容易
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

在这里插入图片描述
面试题
在这里插入图片描述
在这里插入图片描述

对象的实例化

在这里插入图片描述
在这里插入图片描述

创建对象的方式

在这里插入图片描述

1、new,除了简单的new , 还有变形:单例模式,XxxFactory的静态方法

2、3、反射方式:Class下的newInstance()方式在JDK9开始不推荐使用了,因为要求高,必须是空参的构造器才可以
现在推荐使用Constructor下的newInstance(Xxx)的方式。可以调用无参的或者带参的构造器方式,比较灵活

4、使用clone() 浅复制
5、反序列化。序列化可以实现数据从一个进程到另一个进程的传递,基于本地和网络都可以实现,将对象转化成二进制流,传递后再从二进制流转换成对象
6、第三方库:

创建对象的步骤

在这里插入图片描述

首先,new关键字,调用的是底层的new方法创建对象
先查看在方法区是否加载了Object类, 加载完后就开始在堆中开辟对象需要的空间,
1、加载当前对象创建所需要的类对象
在这里插入图片描述
如果是引用变量,那么只给4个字节大小
当内存规整的时候,为对象分配内存使用指针碰撞法,即规整地新分配内存,此处GC对应标记压缩算法。
当内存不规整时,为对象分配内存时会维护一个列表,专门存放空闲内存位置。当分配内存时选择可以放下的内存进行分配
此处GC对应标记清除算法,如CMS,垃圾回收后内存就不是规整的。
在这里插入图片描述

在这里插入图片描述
第四步,这里给对象属性赋值的操作是:属性的默认初始化。
对象属性赋值操作有
1、属性的默认初始化
2、显示初始化和代码块中初始化,这两个就看代码的前后位置
3、构造器中初始化
在这里插入图片描述
第六步:对属性进行显式初始化,代码块初始化、构造器中初始化,也就是Person()这一步,在解析后的字节码中就是中的内容
总结六步:1、加载类元信息2、为对象分配内存空间,分内存规整和不规整的不同分配方式
3、处理并发问题4、为属性进行默认零值初始化5、设置对象头信息
6、最终属性显式初始化、代码块中初始化、构造器中初始化
这六步执行完后,完整的对象才算创建完成

对象的内存布局

在这里插入图片描述
对象头包含两部分内容:运行时元数据和类型指针,运行时元数据其实就是运行中的一些必要信息,类型指针就是对象是由哪个类创建的

对象创建的示例说明

在这里插入图片描述
在这里插入图片描述

通过上图代码创建Customer()对象的过程,内存中布局如下:
在这里插入图片描述

对象访问定位

在这里插入图片描述
通过栈帧中的对象引用来访问堆中创建好的对象,引用保存了对象存储位置的内存地址,所以可以访问到这个对象实例

对象访问的两种方式

由于java虚拟机规范中并没有明确对象访问采用哪种方式,所以就存在这么两种方式
Hotspot采用的是直接指针的方式

1、句柄访问

在这里插入图片描述

2、直接指针

在这里插入图片描述
之所以hotspot最终采用的是直接指针的对象访问方式,还是因为优势更大一点,
在直接指针访问中,1、不存在句柄池这个中间量,所以不用给其分配内存,节省空间,
2、没有中间句柄池,直接进行访问,效率更高
当然,直接指针的缺点就是当对象存储位置发生修改时,变量引用也需要修改,
而在句柄访问方式中,对象存储位置变化时,只要修改句柄池中指针的位置即可。

这篇关于JVM12_StringTable、对象的实例化、对象的内存布局 、对象访问的两种方式、对象头信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/888180

相关文章

Mybatis官方生成器的使用方式

《Mybatis官方生成器的使用方式》本文详细介绍了MyBatisGenerator(MBG)的使用方法,通过实际代码示例展示了如何配置Maven插件来自动化生成MyBatis项目所需的实体类、Map... 目录1. MyBATis Generator 简介2. MyBatis Generator 的功能3

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

Python数据处理之导入导出Excel数据方式

《Python数据处理之导入导出Excel数据方式》Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂... 目录python导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情