Java对象创建过程

createh51周前 (03-05)技术教程6

·new&类加载检测

当遇到new指令时,JVM首先会进行类加载检测:

①检测new指令的参数是否能在常量池中定位类的符号引用;

②检测这个符号引用是否进行过加载解析和初始化,没有则先对该类进行类加载。

·对象内存分配

创建一个对象所需要的内存在类加载完成时就能确定,内存分配是指在堆中划出一块和对象大小的对应内存出来,具体的分配方式根据堆内存的整齐性决定,而堆内存的整齐性则由当前程序采用GC机制决定。

分配方式:①指针碰撞(堆整齐) ②空闲列表(堆不整齐)

分配出现并发情况解决方案:①CAS自旋 ②TLAB本地内存

·值初始化

JVM初始化分配好的内存,将其设为零值(不包括对象头,如果使用了TLAB,这一步会提前到内存分配阶段进行)。

·设置对象头

完成初始化操作后接着会对于对象的对象头进行设置:

①mrakword:存储对象自身的运行时数据,如hashcode、GC分代年龄、锁标志、锁信息等;

②klassword:类型指针,指向它对应的类元数据,JVM用这个确定其属于哪个类的实例。

·执行init函数

最后执行函数,主要是对属性赋值。

·TLAB分配

TLAB(Thread Local Allocation Buffer,即线程本地分配缓存),是一块线程专用的内存分配区域。TLAB占用的是eden区的空间,在TLAB启用的情况下(默认开启),JVM会为每一个线程分配一块私有缓冲区域,即为TLAB内存区域。栈上分配与TLAB分配区别:

①栈上分配使用的是栈来进行对象内存的分配

②TLAB分配使用的是eden区域进行内存分配,实际还是属于堆内存

③栈上分配优先于TLAB分配,逃逸分析中若可进行栈上分配优化,会优先栈上分配内存

④当无法进行栈上直接分配时,则会进行TLAB分配

JVM中TLAB相关参数:

其中,
-XX:TLABRefillWasteFraction指当TLAB空间不足,请求分配的对象内存大小超过此阈值时不会进行TLAB分配,直接进行堆内存分配,否则还是进行TLAB分配。

TLAB的意义:加速对象的分配。因为对象一般分配堆内存,而堆是线程共享的,在多线程环境下,可能会有多个线程同时在堆上申请空间,导致空间分配需要线程同步,会使分配的效率下降。TLAB是Java Hotspot编译器对于new对象的优化,为每一个线程都在Eden区中分配了一块专享空间供线程使用。

·对象成员分配内存后初始化顺序

①处于并列优先级的按照Java程序编写时代码的先后顺序加载

②前面两步为静态过程,程序运行过程中只会执行一次,之后再次创建该类或该子类的对象时并不会再次执行。

相关文章

从一个例子中解析JAVA新建一个对象的过程

先上代码,代码如下://父类 class Father { /*8、执行初始*/ private int i = 9; protected int j; /...

Java 学习之面向对象思想、类、对象

一、首先我们先说说面向过程面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。“面向过程”也可称之为“面向记录”编程思想,他们不支持丰富的“面向对象”特性(比如继承、多态)...

100个Java工具类之78:对象处理工具类Objects

在Java中,对象是类的实例。对象则是类所定义的模板而创建出来的实体,它们封装了属性和方法。Objects类可以用来简化对象的操作,完成常见的对象非空校验、对象比较、生成哈希码等任务从而提高代码的可读...

JAVA创建对象有哪几种方式?

作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象。然而这里有很多创建对象的方法,我们会在这篇文章中学到。 Java中有5种创建对象的方式,下面给出它们的...

揭秘Java中的面向对象模型

前言:前面一系列文章讲了Java的一些语法基础知识、Java中的数据类型和Java中的运算符,基本上都是学习Java语言的基础知识,从这一讲开始将会逐步介绍Java面向对象编程的一些高级知识。所有提到...