对象创建(一)

对象的创建

虚拟机遇到一条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堆内存并不是规整的,已使用的内存和未使用的内存相互交错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值