JVM中对象的创建

一.JVM运行流程

JVM向操作系统申请内存,初始化运行时数据区,接下来装载使用的类,执行类里面相应方法的时候为当前虚拟机栈压入一个栈帧,方法执行完成后栈帧出栈,进行垃圾回收。

二.JVM中对象的创建过程

 

 

符号引用:常量池里面有一个对B对象的引用,但是我们目前不知道B对象的真实地址,所以我们用一个字面量去代表B对象。这就叫做符号引用。在new出A对象,检查加载的时候,JVM会动态解析符号引用装换为真实的地址(直接引用)。

JVM基础(四):Java类加载机制_符号引用转换为直接引用-CSDN博客

分配内存

分配内存的方式

为对象分配内存的方式有指针碰撞,空闲列表。

指针碰撞适用于内存空间较为规整的情况下,为A对象分配3格空间,指针往后移动三格;为下一个对象分配的时候,当前指针位置开始分配即可。

如果内存空间不规整的话,就需要用到空闲列表分配内存。JVM通过维护一张内存列表记录可用的内存块信息,当分配内存时,从列表中找到一个足够大的内存块分配给对象实例,并更新列表上的记录。

这时候可能会有多个线程同时申请一块内存,怎么解决并发安全呢?CAS加失败重试和为线程分配缓冲。

解决并发安全

CAS

CAS操作包括三个操作数---内存位置、预期数值和新值。CAS的实现逻辑是将内存位置处的数值与预期数值向比较,若相等则将内存位置处的值替换为新值。若不相等,则不做任何处理。

CAS的操作是抱着乐观的态度进行的,总认为自己可以成功完成操作,当多个线程同时使用CAS操作同一个变量的时候,只会有一个胜出并成功更新,其他均会失败。失败的线程不会被挂起,仅被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。

举个例子,A和B进行CAS,A的预期值是0,新值是1,B的值是0,A拿到B的值0对比自己的预期值发现相同,就会把1赋值给B,B的值变成1;这时候C的预期值是0,新值是1,C拿到B的值0发现不是自己预期的值,CAS失败。

CAS是一种CPU的指令,CPU的指令要不就执行,要不就不执行,所以具有原子性。如果是多核CPU,会有一个lock指令,保证只有一个CPU执行。

给每一个线程分配一个线程缓冲

一般分配对象都在堆的新生代的Eden区上,如果开启本地线程缓冲,如果A线程和B线程都在Eden分配对象,会分别为这两个线程在Eden区上划分一块区域,让这两个线程分配对象。

JVM默认的方式就是线程缓冲,如果被禁用则使用CAS

内存空间初始化

为当前对象的成员变量初始化值,比说int类型的初始化为0。

设置

针对对象头的一些设置。

对象的内存布局

类型指针:当一个对象创建的时候,在堆里面存储的对象,会有一个类型指针指向方法区里面这个对象的类型。虚拟机通过这个指针来确定这个对象是哪个类的实例。

实例数据:实例数据就是我们所赋予给对象的那些属性信息,这部分内容是紧挨着对象头存储的。

对齐填充:对齐填充并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。由于HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说就是对象的大小必须是8字节的整数倍。对象头正好是8字节的倍数(1倍或者2倍),因此当对象实例数据部分没有对齐的话,就需要通过对齐填充来补全。

对象初始化

构造方法执行。

对象的访问定位

我们一般执行一个方法的时候,会在当前线程的虚拟机栈里面压入一个栈帧,在这个方法里面执行Person person1 = new Person,会在堆里面创建一个对象,这个person的引用会存在虚拟机栈的局部变量表里面,Person类型会存在方法区里面。堆里面的对象的类型指针会指向方法区的Person类型,局部变量表里面的person引用会指向堆里面的对象。

局部变量表里面的person引用指向堆里面的对象,存在两种方式:句柄访问和直接指针。

句柄访问

Java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息。

举个例子,去浴室洗澡,我们拿到搓澡师傅的手牌是13号,这个13号就相当于一个句柄,这个句柄指向的真正对象是王师傅。就相当于这个句柄就是一个代号,我们通过这个代号找到真正的搓澡师傅。

好处:句柄稳定,对象被移动只要修改句柄中的地址,不需要修改线程里面虚拟机栈的栈帧的局部变量表里面的引用。

坏处:需要开辟一块独立的空间给句柄池;同时访问对象效率较低,需要通过两次指针。

直接指针

reference中直接存储的就是对象地址,对象中存储了到对象类型的类型指针。

使用直接指针的方式,访问速度快,节省了一次指针定位的开销。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/604434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第03章_运算符与流程控制

第03章_运算符与流程控制 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题脉络 1. 运算符(Operator) 运算符是一种特殊的符号,用以表示数据的运算、赋…

CSS基础笔记-04cascade-specificity-inheritance

CSS基础笔记系列 《CSS基础笔记-01CSS概述》《CSS基础笔记-02动画》CSS基础笔记-03选择器 前言 Cascading Style Sheets,关键就在于这个cascading,对于这个术语理解,感觉对于我这种CSS新手有点儿不太friendly。本文记录下我对这个术语的理…

CoroutineScope Dispatchers.IO异步操作async返回函数,Kotlin

CoroutineScope Dispatchers.IO异步操作async返回函数,Kotlin import kotlinx.coroutines.*fun myFun(a: Int, b: Int, retFun: (sum: Int) -> Unit) {println("分支myFun开始... ${System.currentTimeMillis()}")val task CoroutineScope(Dispatcher…

互联网分布式应用之SpringCloud

SpringCloud Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. 微服务项目介绍 2. Eure…

修复 OpenCV 依赖错误的小工具:OpenCV Fixer

使用 Nvidia 官方 Docker 镜像折腾 Stable Video Diffusion 的时候,发现 OpenCV 社区有一个古怪的 issue 需要手动解决,所以顺手写了一个能够自动修复的小工具。 以及,聊聊如何快速的发布一个 Python 软件包。 写在前面 如果你在使用 Pyth…

kafka-zookeeper集群架构可视化监控,Kafka-Eagle安装部署

1、简介 在 kafka-zookeeper 集群架构下,zookeeper 管理 kafka 的元数据信息,如何监控这些信息,并且能够直观查看和管理 kafka 一些具体 主题、分区等参数信息,是非常便于开发的,因此 Kafka-Eagle 是一个为监控 kafka …

git 常用命令 rebase发生冲突时 ☞ 撤销rebase

场景:rebase发生冲突时 ☞ 撤销rebase git rebase --abort git reset --hard HEAD git reset --hard 8ec554Further Reading :Git常用命令汇总

智慧医院预约及支付平台—平台系统功能介绍

智慧医院APP(大众版) 系统概念 智慧医院APP(大众版)是面向居民大众,提供基于居民健康档案移动端的服务, 能够为居民提供全流程的医疗就诊服务支持,包括便捷的就医帮助,精确高效的健康管理服务,缓解居民的看病难、看病贵的问题。 功能清单 功能类别 功能模块 功能说…

一个奇怪的Oracle SQL Loader错误

今天在用Oracle SQL Loader导入文本文件时,发生了一个奇怪的问题,就是:我的输入文本文件dbim.dat放在oracle用户根目录($HOME)下时,导入不成功;而将其放在/u01/app/oracle目录下时,则…

基于机器视觉的车牌检测-边缘检测因子的选择

车牌检测概述 车牌识别在检测报警、汽车出入登记、交通违法违章以及移动电子警察方面应用广泛。车牌识别过程为:首先通过摄像头获取包含车牌的彩色图像;然后进行车牌边缘检测,先粗略定位到车牌位置,再精细定位;最后根…

面试经典150题(67-71)

leetcode 150道题 计划花两个月时候刷完,今天(第三十四天)完成了5道(67-71)150: 67.(114. 二叉树展开为链表)题目描述: 给你二叉树的根结点 root ,请你将它展开为一个单链表&#…

[AutoSar]基础部分 RTE 05 Port的实例化和初始化

目录 关键词平台说明一、端口类型二、端口的实例化2.1 创建application port2.2 实例化 三、初始化 关键词 嵌入式、C语言、autosar、Rte 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C,C编译器HighTec (GCC) 一、端口类型 如下图所示&am…

MvvmToolkit的使用

背景:MvvmLight不更新了,用Toolkit代替 1、首先下载好社区版本的NuGet包 2、ViewModel中需要继承ObservableObject,查看ObservableObject可以看到里面有实现好InotifyPropertyChanged。 3、对于属性的set,可以简写成一行&#xff…

鸿蒙应用开发 闹钟实现

后台代理提醒简介 随着生活节奏的加快,我们有时会忘记一些重要的事情或日子,所以提醒功能必不可少。应用可能需要在指定的时刻,向用户发送一些业务提醒通知。例如购物类应用,希望在指定时间点提醒用户有优惠活动。为满足此类业务…

PTA——L2-041 插松枝(25分、模拟题)

文章目录 一、题目二、题解1.基本思路: 一、题目 人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上,做成大大小小的松枝。他们的工作流程(并不)是这样的: 每人手边有一只小盒子,初始状态为空。…

C++与数据库MySQL锁——模拟订票(事务)

假设订票的时候,好几个人同时进入,查看这张票是否售出,假如同时购买了这张票,那对于售票行业来说,可能就会发生低级错误。那么如何避免这类事情发生呢? 解决办法: 在一个人访问的时候&#xf…

Nginx(二十) 获取真实客户端IP

客户端在访问互联网应用服务器时,与真实的应用服务器之间会因为有多层反向代理,而导致真实应用服务器获取的仅是最近一层的反向代理服务器 IP。为使 Nginx 后端的上游服务器可以获得真实客户端 IP,Nginx 提供了 ngx_http_realip_module 模块用…

HCIA-Datacom题库(自己整理分类的)_11_其他网络协议单选【9道题】

1.DNS协议的主要作用是? 文件传输 远程接入 域名解析 邮件传输 2.下列属于链路状态协议的是? Direct static FTP OSPF 解析: FTP:文件传输协议 OSPF:链路状态路由协议 3.如下图所示的网络主机A通过Telnet登录到路由…

Hystrix熔断/断路器

简介 Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故…

环形链表 II【链表】【哈希】

Problem: 142. 环形链表 II 文章目录 思路 & 解题方法复杂度Code 思路 & 解题方法 哈希 复杂度 时间复杂度: 添加时间复杂度, 示例: O ( n ) O(n) O(n) 空间复杂度: 添加空间复杂度, 示例: O ( n ) O(n) O(n) Code # Definition for singly-…