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初始化

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

最新文章

  1. Bootstrap3 Grid system原理及应用
  2. Nodejs&express+mongodb完成简单用户登录(即Nodejs入门)
  3. WordPress使用记录
  4. Linux14.04安装Mysql Linux公社
  5. 51nod p1175 区间中第K大的数
  6. SecureCRT自动备份脚本-华为
  7. LeetCode---- 二叉树中,找出和为某值的所有路径
  8. keil中的存储模式
  9. Mapreduce-Partition分析
  10. Ubuntu 字体安装
  11. 数据结构之顺序栈SqStack
  12. HTML5 canvas易错点
  13. poj 3740 Easy Finding 精确匹配
  14. Struts框架中struts-config.xml文件配置小结
  15. Mybatis框架 基础
  16. python_如何通过twisted实现数据库异步插入?
  17. 【RL-TCPnet网络教程】第31章 Telnet远程登录基础知识
  18. 【.NET Core项目实战-统一认证平台】第十章 授权篇-客户端授权
  19. Go 变量声明后若不赋值,各类型默认值
  20. Sprite/MovieClip的Enter_Frame事件,不受addChild/removeChild影响

热门文章

  1. Ubuntu22 vim配置
  2. 回溯-1-N皇后(Backtracking-1-N Queens)
  3. gdb 常用命令总结
  4. RayLink 远控软件又推出 2 个重磅宝藏功能免费用
  5. Spring事务注意事项 以及 遇到的坑
  6. Servicemonitor监控自带metrics接口和无metrics接口
  7. jwt刷新token
  8. Ajax后台传数组参数,接收不到报错!
  9. WDA学习(24):Context Menu使用
  10. C# 使用CefSharp完成自动签到