首页 > 其他分享 >对象的创建过程

对象的创建过程

时间:2022-10-24 22:37:34浏览次数:98  
标签:对象 创建 虚拟机 线程 TLAB 过程 分配 加载


  1. 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须执行相应的类加载过程。
  2. 类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需的内存的大小在类加载完成后便可完全确定。内存分配又有两种方式:指针碰撞(Bump the Pointer)和空闲列表(Free List)。选用哪种分配方式由堆是否规整来决定,而堆是否规整又由垃圾收集器是否带有压缩整理功能决定。
    ​ 在Serial、ParNew等带有compact过程的收集器,系统采用的分配算法是指针碰撞,而使用CMS这种基于Mark-Sweep算法的收集器时,通常采用空闲列表。
    除了如何划分空间之外,还要考虑并发情况下线程安全问题。由两种解决方案:
  1. 分配内存空间的动作进行同步处理-实际上虚拟机采用CAS配上失败重试的方式保证更新操作的原子性。
  2. 把内存分配的动作按照线程划分在不同的空间中进行,即每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲(Thread Local Allocation Buffer, TLAB),哪个线程要分配内存,就在哪个线程的TLAB上分配。只有TLAB用完并分配新的TLAB时,才需要同步锁定。可以通过​​-XX:+/-UseTLAB​​参数来设定。
  1. 分配完内存后,虚拟机需要将分配到的内存空间初始化为0值(不包括对象头),如果使用TLAB,这一工作过程可以提前至TLAB分配时进行,这一操作保证了对象的实例字段在Java代码中可以不赋初始值就直接使用。
  2. 设置对象头(Object Header),对象是哪个类实例、如何才能找到类的元数据信息、对象哈希码、对象的GC分代年龄等信息。
  3. 上面工作完成之后,从虚拟机角度来看,一个新的对象已经产生了,但从Java程序视角来看,对象的创建才刚刚开始-<init>方法还没有执行,所有字段还都为0。

实时内容请关注微信公众号,公众号与博客同时更新:程序员星星

对象的创建过程_内存空间


标签:对象,创建,虚拟机,线程,TLAB,过程,分配,加载
From: https://blog.51cto.com/u_7841967/5791471

相关文章

  • JavaScript学习--History&Location对象
    History:历史记录获取:window.history.方法();window可省略方法:back()加载history列表的前一个urlforward()加载history列表的下一个url Location:地址栏对象获取win......
  • EBS-AR:“创建会计科目"程序出现内部错误
    AR一张手工应收事务处理单,执行“创建会计科目”时提示以下错误,无法创建此事务处理的联机会计科目。请通知您的系统管理员:“创建会计科目"程序出现内部错误。   ......
  • MySQL执行过程(一条SQL从Java到数据库都经历了什么)
    MySQL执行过程(一条SQL从Java到数据库都经历了什么) 2021-11-1420:44:47    小道仙    100阅读    0评论视频地址 https://www.bilibili.com/video......
  • PVE创建ubuntu CT并安装sqlServer
    一、创建LXC容器模板选择下载好的ubuntu20.04网络选择一个未分配的静态IP    二、登录到ubuntu系统,开启ssh登录......
  • 2 django 创建一个项目
    二、django创建一个项目1.创建项目https://www.cnblogs.com/eosclover/p/16796616.html1.1用专业版创建django项目打开pycharm,点击左上角file-->NewProject......
  • mysql创建账号和分配取消权限
    虽然网上资料很多,但自己每次都要查有的麻烦,这里自己记录下。1、没账号时创建账号:createuser'用户名'@'%'identifiedby'密码';%表示不限制,也可以写要限制的具体ip......
  • 6.属性值的计算过程
    属性值的计算过程一个元素一个元素依次渲染,顺序按照页面文档的树形目录结构进行渲染每个元素的前提条件:该元素的所有CSS属性必须有值一个元素,从所有属性都没有值,到所有......
  • 命令式对象配置—yaml书写
    一、配置文件中字段查询#比如要写pod的yaml文件,那么我们先来查询下编写pod文件,有哪些字段可以书写kubectlexplainpod二、示例:创建一个nginx应用要求:命名空间名为......
  • day18面向对象
    概述:面向对象是一种编程思想(oop),是对面向过程的一个抽取和简化。主要是以类构建对象,来存储对应的行为及属性,将抽取的行为作为方法,对应的属性为属性,所有内容都可以抽取为一个......
  • 前端小功能开发过程小结
     做select的时候,页面要求为:载入默认选项框为空白,点击下拉框显示正常选项。有两种办法,一种纯css实现,一种借助js实现。JS:<bodyonload="load()"><selectid="abc">......