• 对象的创建


    以下创建指的是普通的Java对象,不包括数组和Class对象
    1、类加载,首先检查指令的参数能否在常量池中定位到一个类的符号引用,检查这个符号引用代表的类是否被加载解析初始化,如果没有那就必须先执行相应的类的加载过程。

    2、类加载检查通过后,虚拟机为新建的对象分配内存。对象的内存在类加载的时候已经可以完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。
      内存分配:a、指针碰撞,假设Java堆中内存是绝对规整的。所有有用的内存都放在一边,空闲的内存放在另外一边,中间放一个指针作为分界点的指示器,那么分配内存仅仅是把那个指针向空闲空间那边进行挪动一段与对象空间大小相等的距离。适用于Seria和

                                       ParNew等收集器。           

                              b、空闲列表如果内存不是规整的,已使用的内存与空闲的内存是相互交错,必须维护一个表来记录哪些内存块是可用的,在分配的时候从列表中找到一个足够大的空间划分给对象,并更新列表上的记录。适用于CMS这种Mark-Sweep算法的垃圾收集                                       器。内存分配取决于Java堆是否规整,Java堆是否规整取决于垃圾收集器。对象创建在内存中分配空间的非线程安全问题解决方案:a、分配内存空间进行同步处理--在实际的虚拟机中采用CAS配上失败重试的方法保证更新操作的完整性;b、内存                                     分配工作按照线程的不同在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓存(Thread Local Allocation Buffer,TLAB)。

    3、内存分配完成之后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头),如果使用了TLAB,该部分工作也可以在TLAB分配的时候完成。保证了对象在不赋初始值的情况下就可以直接使用。

    4、虚拟机对对象进行必要的设置,主要进行的是对象头的内容设置,具体详见关于对象头的相关内容。

    5、虚拟机视角的新的对象已经产生,但是<init>还没有执行,所有的字段是零值,后面需要执行<init>方法,按照程序员的意愿进行初始化,一个真正的对象完成创建。

  • 相关阅读:
    【每天都要看一下】
    【这里有别人的经验,也有好玩的发现】
    【WPF】Listbox模板内button点击选中当前listboxItem
    【WFP】弹出窗口不在win10 任务列表里显示的方法
    PSD路径转换为 WPF path 的data
    【WPF】Listbox内item的样式替换默认选中样式和鼠标滑过样式
    【WPF】ListBox1内嵌套ListBox2 2的滑轮滚动阻止1的滚动解决方法
    【C#】文本框拼音检索汉字
    【WPF】Datagrid显示最低下一跳
    【C#】绝对随机数
  • 原文地址:https://www.cnblogs.com/mayang2465/p/11919034.html
Copyright © 2020-2023  润新知