您的位置:首页 > 编程语言 > Java开发

Java对象创建的过程

2019-08-01 20:32 501 查看

以Object obj = new Object();

1.检查常量池中是否存在该类的符号引用,如果没有,则先加载该类,并解析和初始化

2.为对象分配内存空间(内存大小在类加载的时候已经确定大小

分配内存过程中需要考虑的问题:

内存是否规整

         ① 假设Java 堆中内存是连续规整的,也就是说Heap中一侧是已经使用过的内存空间,而另一侧是空闲空间,则此时使用指针指向起始空闲内存,当需要分配新的空间时,只需要将指针向后移动制定空间大小位置即可完成内存的分配,这种分配方式称为“指针碰撞”(Bump the Pointer) 

         ② 假设内存并不是连续规整的,空闲和使用的相互交错,则此时JVM就需要记录哪些内存块石可用的,分配时,分配足够大的空间给对象实例,同事更新记录列表。这种方式称为“空闲表”(Free List) 

而是采用Bump the Pointer的方式还是Free List的方式由JVM Heap是否规整决定,而Heap的规整与否又由所采用的垃圾收集器是否带有亚索整理的功能决定。使用Serial、ParNew等带有Compact过程的收集器时则采用指针碰撞,而使用CMS这种给予Mark Sweep算法收集器时,采用Free List方式

对象的创建十分频繁,如何解决并发带来的不安全问题??

  1.  内存分配完成后设置对象头

实例是哪个类的实例、类的元数据信息、对象的哈希码、对象的GC分代信息

以上信息位于对象的头信息中(ObjectHeader),除此之外,对象的其他字段都还是0,至此一个新的对象已经产生,但是尚未进行初始化。                                                                                             

  1. 对象初始化,执行init方法。创建完成

  对象在内存中存储的布局可以分为3块区域:对象头,实例数据,对齐填充。

  对象的定位访问有:句柄和直接访问。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java Sweep Mark