主要是针对HotSpot虚拟机来说的

1.对象的创建过程-new 对象()

1.1检查类是否被加载

  检查创建的这个对象的类是否能在常量池中找到类的符号引用,并检查这个类是否被加载、解析和初始化。如果没有,先要进行类的加载

1.2在堆中分配内存

  对象需要分配的大小是在类加载完成后就可以确定的,需要做的就是在堆中分配出一块指定大小的内存区域

1.2.1分配的两种方法

1)指针碰撞

  如果堆的内存是规整的,那么内存就清晰的分为已用和空闲两部分,中间由指针隔开。分配内存时,只需要移动指针即可。

2)空闲列表

  如果堆的内存是不规整的,已使用的内存和空闲的内存交错在一起。虚拟机就会维护一个列表,记录那些内存时空闲的,在分配的时候找出一块足够大小的内存块分配出去。(如果要分配32b,现在最小的空闲的是64,是不是分配32b出去,剩余的32b还记录在在空闲列表里面),并且更新列表

3)两种分配方法的决定因素

  由堆内存是否规整决定,堆内存是否规整是由垃圾回收期是否拥有压缩整理的能力决定的。有则是规整的,没有是不规整的。

1.2.2分配内存中的线程安全问题

  即使仅仅移动个指针,都存在并发安全问题。正在给对象A分配内存,指针还没来得及修改,对象B使用了原来的指针,就出现了线程安全问题。

  虚拟机有两种解决方案

  1)CAS+自旋锁保证操作的原子性(https://www.cnblogs.com/jthr/p/14700940.html)

  2)使用本地线程分配换缓冲区TLAB,为每个线程预先分配一块内存区域,称为本地线程分配换缓冲区。线程需要为对象分配内存时,在自己的分配缓冲区进行分配即可。只有本地线程分配换缓冲区不够用时,需要分配新的缓冲区,这个时候才需要同步。虚拟机是否使用TLAB,可以通过设置参数-XX:+/-UseTLAB来设定

1.3堆对象的内存空间除了对象头外(也就是对实例数据)都初始化为零值

  这部工作保证对象实例字段在JAVA代码中可以不必赋初始值就可以使用。,使程序能够访问到这些字段所对应的类型的零值

1.4 对对象进行必要的设置

  这个对象是哪个类的实例、怎么能够找到类的元数据、对象的哈希码、对象的GC分代年龄等信息。这些信息都存放在对象头

1.5运行init方法

  执行代码块、构造方法。对对象进行初始化。

2.对象的内存布局

  对象头、实例数据、对齐填充

  对象头:对象头又包括两类:markword,class pointer,

https://www.cnblogs.com/jthr/p/15980849.html

2.1对象头

  对象头包含两类信息。

  第一类是用于存储对象自身的运行时数据,如哈希码、GC年龄分代、锁状态标志、线程持有的锁、偏向线程id、偏向时间戳等(这几个东西都是什么东西???)

  另外一类是类型指针。即对象指向它的类的元数据的指针。java虚拟机通过它来确定对象数据哪个类的实例,找到对象的元数据。如果对象是一个数组,那么对象头还必须有数组长度。因为虚拟机可以通过对象的元数据确定对象的大小,但是如果不知道数组长度,将无法通过对象元数据学习确定数组对象的大小

2.2实例数据

  这是对象真正存储的有效信息。即我们代码定义的各种字段的内容。

2.3对齐填充

  这部分不是必有的。它仅仅起占位符的作用。HotSpot要求对象的起始地址必须是8字节的整数倍。也就是说对象的大小必须是8字节的整数倍。对象头已经被设计为了8的整数倍,不会有对齐填充。但是,如果对象实例数据部分没有对齐的话,就通过对齐填充来补全

3对象的访问定位

  创建对象后使用对象,java通过reference类型指向对象的引用。reference通常使用两种方式,句柄和直接指针。

3.1句柄

  java对中会划分一块区域为句柄池,用于维护句柄。reference存的是句柄的地址。句柄中包含了对象实例数据的指针和对象类型数据的指针

3.2直接指针

  reference存的是对象地址。这里对象实例存放对象类型数据的指针

3.3优劣

  使用句柄的好处是reference存储的是稳定的句柄地址。对象移动是句柄的地址不会变化,只是句柄里面的指针需要修改。

  使用直接指针的好处是速度更快。对于HotSpot而言,它主要使用直接指针。

最新文章

  1. inline函数的用法
  2. 创建线程方式-GCD
  3. Codeforces Round #155 (Div. 2)
  4. EMVTag系列3《持卡人基本信息数据》
  5. 归并排序,递归法,C语言实现。
  6. 教程-隐藏/显示任务栏-程序不在任务显示-全面控制Windows
  7. Chrome使用小技巧-多用户登录、直接打开隐身模式窗口
  8. CodeForces 711D Directed Roads
  9. 【前端基础系列】理解bind方法使用与实现
  10. 小程序动态添加class及调接口传递多个参数
  11. .NET 里delegate和event的区别
  12. Android Studio 自动更新失败解决办法
  13. springboot activiti关闭验证自动部署
  14. [翻译] WPAttributedMarkup
  15. 完美解决doc、docx格式word转换为Html
  16. jquery checkbox勾选/取消
  17. [转] Android Fragment 你应该知道的一切
  18. 把本地jar包发布到maven私服和本地maven库
  19. jq学习笔记(二)
  20. 企业级Tomcat部署配置

热门文章

  1. 2022-11-16 Acwing每日一题
  2. 利用KubeEdge在A500部署边缘推理任务
  3. Go语言核心36讲15---结构体
  4. 本地JS文件批量压缩
  5. elasticsearch 聚合之 date_histogram 聚合
  6. 你的项目使用Optional了吗?
  7. C/C++标准输入输出函数终极最全解析(不全捶我)
  8. 常用BOM操作 DOM操作 事件 jQuery类库
  9. Qt开发Active控件:如何使用ActiveQt Server开发大型软件的主框架(2)
  10. 基于 Traefik 的激进 TLS 安全配置实践