ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

深入理解JVM (1) --- JVM中对象的创建

2021-01-11 17:34:38  阅读:205  来源: 互联网

标签:对象 创建 虚拟机 --- 线程 TLAB JVM 分配


在此JVM 主要分析的是Hotspot

  1. 收到new 指令,去检查这个指令的参数是否能在常量池中定位到一个类的符号引用。并检查这个类是否已经被加载、解析、初始化过。如果没有则执行类加载过程。
  2. 类加载通过后,JVM为新生对象分配内存。(类加载完成后可以确定对象所需的内存大小)方式有:指针碰撞空闲列表

指针碰撞:一个指针在空闲内存和使用的内存中间,分配内存的是指针向空闲空间移动对象大小对应的空间。 Serial、ParNew 等带Compact 过程的收集器时,系统采用的分配算法是指针碰撞。
空闲列表:虚拟机维护一个列表,记录哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象,并更新表上记录。 使用 CMS 这种基于Mark-Sweep算法的收集器时,通常采用空闲列表。

  1. JVM 采用CAS + 失败重试的方式保证更新操作的原子性,还有就是通过TLAB保证。

TLAB : 将内存分配的动作按照线程化划分在不同的空间中进行,即每个线程在JAVA堆中预先分配一小块内存,称为本地线程分配缓冲(Thread Local Allocation Buffer)。哪个线程要分配内存,就在那个线程的TLAB分配,只有TLAB 用完并分配新的TLAB时,才需要同步锁定。虚拟机是否使用TLAB,可以通过-XX:+/-UseTLAB 参数来设定。

  1. 内存分配完成后,虚拟机需要将分配到的内存空间都是初始化为零值(不包括对象头),如果使用TLAB,这一工作过程可以提前至TLAB分配时进行。(保证了对象的实例字段在java代码中可以不赋初始值就可以直接使用,程序嫩嫩那个访问到这些字段数据类型所对应的零值。
  2. JVM对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到该类的愿你数据信息、对象的哈希码、对象GC分代年龄等信息。这些信息存放在对象的对象头(Object Header)之中。
  3. 以上完成,在虚拟机角度已经创建了对象。但是再JAVA 程序角度刚刚开始,Java 程序执行对象 方法。

标签:对象,创建,虚拟机,---,线程,TLAB,JVM,分配
来源: https://www.cnblogs.com/winstonehome/p/14263243.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有