Java对象的创建

  Java是一门面向对象的语言,在语言层面,我们平时创建对象就使用关键字new就行,但是在虚拟机中,对象的创建是一个怎样的过程呢?

  1.Java虚拟机遇到一个字节码new指令的时候,首先会去检查这个指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号所引用代表的类是否被加载、解析和初始化,如果没有那么就要执行类加载过程。

  2.类加载完毕之后就要为新生对象分配内存。分配内存的过程有2种方式,一种是指针碰撞(Bump the Pointer),一种是空闲列表(Free List)。大家都知道分配内存是在堆中,而在堆中,又根据使用的不同的垃圾收集器可以分为(空间压缩整理Compact)Serial、ParNew垃圾收集器 和采用(清除算法Sweep)的CMS垃圾收集器 。空间压缩整理就适合使用指针碰撞,对于采用清除算法的就适合使用空闲列表。

  3.创建对象的时候,还需要考虑一个问题,对象分配在堆中,在并发的情况下,并不是一个线程安全的,解决办法就是2种:一种是采用分配空间同步,另外一种是TLAB,本地线程缓冲。

  4.内存分配完成之后,还需要初始化对象的属性为零值。

  5.虚拟机还要对对象进行必要的设置,例如这个对象是哪一个的实例,如何找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。这些信息都是放在对象头中的。

  6.以上工作完成之后,还需要对对象进行构建,使用构造函数,需要执行class文件中的<init>()方法, 按照我们程序员的意愿来进行构造一个可供使用的对象。

posted @ 2023-04-04 11:18  程序员hg  阅读(27)  评论(0编辑  收藏  举报