JVM-创建一个对象的详细过程

Person person=new Person();

1.现在栈中申请一个自己的栈空间

2.类加载检查

每当使用new操作符创建一个对象时,类加载器都会从常量池中寻找该对象的符号引用,如果找到,则根据该引用查询该类是否已被加载,否则进行接下来的类加载操作,在此过程中,类所需内存大小也被确定下来

3.分配内存

JVM根据在类加载检查中确定的内存大小,在堆中为类开辟一段空间,分配的方式有指针碰撞、空闲列表两种方式,若JVM的垃圾回收器(GC)使用了标记-整理的算法,即有值的内存往左侧移动,使得内存规整,则采用指针碰撞分配。若GC使用的是标记-清除算法,定期清除堆中无效的内存空间,则使用空闲列表,在堆中寻找一块内存合适的空间分配内存。

JVM使用cas+失败重试的方式保证并发处理时,创建对象的线程安全,cas为乐观锁的一种实现,即不加锁,默认在执行操作时不会发生冲突。若发生了冲突则进行失败重试,直到完成操作为止。每当线程创建时,首先给线程分配一块自己的内存,分配内存首先在此分配,当线程内的内存空间不足以为对象分配内存时,再采用cas+失败重试的方式分配。

4.初始化零值**

内存空间分配完毕后,对内存中的值都进行初始化,如整型的值为0,引用类型为null,final修饰的变量赋值真正的值

static修饰的赋值为0 这使得类实例可不经初始化直接使用

5.设置对象头

初始化零值过程并不包括初始化对象头,这一步是针对JVM虚拟机的,如

设置对象的hashCode,

GC分代年龄,

锁状态标志:对象的加锁状态分为无锁、偏向锁、轻量级锁、重量级锁几种标记。

持有锁的线程: 持有当前对象锁定的线程ID。

数组长度:当对象是数组类型的时候会记录数组的长度。

6.init初始化

执行自己定义的初始化对象信息的内容,如执行构造函数中的代码

Original: https://www.cnblogs.com/lzbbbb/p/16591894.html
Author: 小北呦
Title: JVM-创建一个对象的详细过程

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

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

(0)

大家都在看

  • SpringCloud + MyBatis Plus + Druid + dynamic-datasource 多数据源配置

    SpringCloud:Greenwich.SR2 Spring-boot : 2.1.7.RELEASE Spring:5.1.9.RELEASE 如果没有设置上文红色部分配置,…

    Java 2023年5月30日
    065
  • PHP 实现微信红包拆分算法

    php;gutter:true; handle(); * print_r($res); * * @author Flc * @see http://flc.ren | http:/…

    Java 2023年6月7日
    060
  • 【Docker入门】Docker的常用命令

    了解和安装完docker之后,我们学习一下docker的常用命令就和当初学linux命令一样,放心命令其实大致相同只不过细节不同。 二、Docker镜像命令 各个选项说明: REP…

    Java 2023年6月13日
    074
  • 利用快慢指针寻找链表中点

    快慢指针的原理类似于时钟里的分针时针,在链表中,二者同时从head首节点出发,快指针一次走两步,慢指针一次走一步,当快指针走到终点时,慢指针所在位置即为链表的中点。 代码: cla…

    Java 2023年6月13日
    075
  • Java使用 Thumbnails 压缩图片

    业务:用户上传一张图片到文件站,需要返回原图url和缩略图url 处理思路: 因为上传图片方法返回url是单个上传,第一步先上传原图并返回url 处理缩略图并上传:拿到Multip…

    Java 2023年6月9日
    086
  • SpringBoot进阶教程(七十一)详解Prometheus+Grafana

    随着容器技术的迅速发展,Kubernetes已然成为大家追捧的容器集群管理系统。Prometheus作为生态圈Cloud Native Computing Foundation(简…

    Java 2023年6月8日
    0181
  • Java 全栈知识体系-JUC线程池: ThreadPoolExecutor详解

    本文主要对ThreadPoolExecutor详解。@pdai JUC线程池: ThreadPoolExecutor详解 带着BAT大厂的面试问题去理解 为什么要有线程池 Thre…

    Java 2023年5月29日
    078
  • springboot2 整合发送邮件的功能

    1,你需要申请一个邮箱 1,申请一个 163 的邮箱并登入,这个很简单 2,如下图进入设置 3,确定下图中的选项为开启状态,切记,开启功能的时候,系统会给你分配一个授权码,只会显示…

    Java 2023年5月30日
    063
  • spring-MVC

    步骤 1.创建maven父项目 导入公共依赖 junit junit 4.12 org.springframework spring-webmvc 5.1.9.RELEASE ja…

    Java 2023年6月7日
    072
  • Spring Cloud Alibaba Nacos 中处理Consumer的UnknownHostException的问题

    问题的原因是 Spring Cloud Alibaba 2020 之后弃用了 spring-cloud-starter-netflix-ribbon ,而改用 loadbalanc…

    Java 2023年5月30日
    065
  • 生产环境中java api访问HDFS权限问题Permission denied解决方案

    java api访问hdfs文件系统未指定访问用户的情况下出现报错 //1、创建hadoop configuration对象 // Configuration conf = new…

    Java 2023年5月29日
    0102
  • Array源码刨析

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月6日
    074
  • 反射和注解

    1.1 类加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化。如果不出意外情况,JVM将会连续完成这三个步…

    Java 2023年6月6日
    088
  • windows 中如何定位恶意软件的藏身位置

    一: 下载spy++ 打开后 点击 搜索下面的查找窗口(Alt+F3) 点击 查找程序工具 右侧的 靶子一样的图标,鼠标左键按住不放,拖放到 弹窗上面,弹窗周围会出现 黑框。 然后…

    Java 2023年6月16日
    085
  • 再谈MySql索引

    一、索引简介 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 索引分单列索引(主键索引、唯一索引、普通索引)和组合索引。单列索引,即…

    Java 2023年6月5日
    074
  • java并发的发布和订阅测试

    现在编码的时候,为了处理消息,大家动不动就上个重器,例如MQ之类的。但很多时候,并不是那么有必要,因为数据量和并发其实远远不够。 可以替代的方案非常多,其中一个是java.util…

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