• 对象创建(一)


    对象的创建

    虚拟机遇到一条new指令时
    1,检查这个指令的参数是否能正常在常量池中定位到这个类的符号引用(句柄?),
    2,检查这个富豪引用代表的类是否被加载,解析和初始化过,
    3如果没又,必须西安执行相应的类加载过程

    类加载过程:

    类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(loading),验证(verifiacation),准备(perparation),解析(resolution),初始化(initialization),使用(using)和卸载(unloading)
    验证(verifiacation),准备(perparation),解析(resolution)统称为链接(linking)

    加载(loading),验证(verifiacation),准备(perparation),卸载(unloading)这五个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班的开始,
    解析(resolution)过程则不一定,某些情况下会在初始化之后开始,这是为了支持Java语言的运行时绑定

    什么时候开始加载,虚拟机规范中并没有进行强制约束,由虚拟机自由把控,但初始化阶段,虚拟机制定了5种严格的规则,在这5种情况下(虚拟机规范中明确限定:有且仅有)必须立即对类进行初始化(加载(loading),验证(verifiacation),准备(perparation)仍然在这之前)
    1,使用new的时候,调用静态方法的时候,读取设置一个类的静态字段时
    2,使用java,lang,reflect 包的方法对类进行反射调用的时候
    3,初始化一个类,其父类未初始化的时候(继承,双亲委派,-XX:+TraceClassLoading观察到此操作)
    4,虚拟机启动时用户需要制定一个执行的主类(包含main()方法的类),虚拟机会先初始化这个类
    5,只用jdk1.7动态语言支持时,如果一个java,lang.invoke.methodhandle实例最后的解析结果REF_getstatic…的方法句柄,并且这个方法句柄所对应的类没有进行初始化

    特别需要注意的是,在虚拟机中"类加载(Class Loading)"和"加载"是两个概念

    至于类加载过程的细节另外总结,今天的目的主要是探讨对象的创建

    在经过上述类加载检查通过后,虚拟机将为一个新生对象分配i内存,对象所需内存的大小在类加载完成之后便可完全确定(如何确定之后讨论总结)
    ,即把一块确定大小的内存从java堆中划分出来,假设java中内存是绝对规整的,所有用过的内存放在一边,没有使用的内存放另一边,中间放指针作为分界点指示器,分配内存时仅仅把指针像空闲空间一冻与对象大小相同的距离,这种分配方式称为**(指针碰撞)Bump the Pointer**(GC回收的),如果java堆内存并不是规整的,已使用的内存和未使用的内存相互交错

  • 相关阅读:
    Promise异步编程
    软件工程综合实践课程第一周作业(面向对象编程实验与继承与多态实验)
    Active Directory报表计划
    鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    如何找到一个靠谱的房东:租房宝典
    K8S云平台环境调优说明
    Serverless 的前世今生
    解决electron + react单页应用调用localhost服务失败
    麒麟系统开发笔记(十二):在国产麒麟系统上编译GDAL库、搭建基础开发环境和基础Demo
    hive limit分页查询、row_number()分页查询
  • 原文地址:https://blog.csdn.net/weixin_44547668/article/details/126398750