一个对象从0到1又为0发生了什么事情?

Java是一门面向对象的编程语言,Java程序运行的过程中,无时无刻都有对象被创建出来,对于程序员来说,创建一个对象仅仅是一个new关键字而已,那么对于虚拟机来讲,对象创建是怎么的一个过程呢?

1. 类加载过程

在Java中,所谓类的加载是指将类的相关信息加载到内存。在Java中,类是动态加载的,当第一次使用这个类的时候才会加载,加载一个类时,会查看其父类是否已加载,如果没有,则会加载其父类。

(1)虚拟机类加载机制

在这里插入图片描述

类的生命周期
	加载(Loading)
		通过一个类的全限定名来获取定义此类的二进制字节流
		将二进制字节流代表的静态存储结构转化为方法区的运行时数据结构
		在内存中生成一个代表该类的java.lang.Class对象,作为方法区这个类各种数据的访问入口
	连接
		验证(Verification)
			文件格式验证:保证输入的字节流能正确地解析并存储雨方法区之内
			元数据验证:语义校验,保证不冲突
			字节码验证:通过数据流分析和控制流分析,确定程序语义是合法的,符合逻辑的
			符号引用验证:发生在解析阶段
		准备(Preparation)
			正式为类变量分配内存并设置初始值(默认值)
		解析(Resolution)
			把间接引用转换为直接引用
	初始化(Initialization)
		执行<cliinit>(),初始化类变量、静态代码块
	使用(Using)
	卸载(Unloading)
Java类加载器

在这里插入图片描述

	启动类加载器(Bootstrap ClassLoader)
	扩展类加载器(Extension ClassLoader)
	应用程序类加载器(Application ClassLoader)
	自定义类加载器(User ClassLoader)
双亲委派模型
	工作过程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,
	而是请求委派给父类加载器去完成,每一个层次的类加载器都是如此,只有当父类加载器无法加载,
	自己才会去尝试自己加载
破坏双亲委派模型

2. 对象分配内存

在类加载检查完毕之后,接下来就是虚拟机为新生的对象分配内存了。
对象所需内存大小在类加载完毕之后就可以完全确定,为对象分配空间的任务实际上等同于在Java堆中划分出一块大小固定的内存空间。

为对象分配内存有两种方式:
“指针碰撞”:假设Java堆中内存是绝对规整的,所有被使用过的内存放在一遍,没有使用过的内存放在另一边,中间有一个指针指定他们之间的分割线,那么我们分配内存的方式仅仅是将指针向未使用过的内存区域移动而已。
“空闲列表”:如果Java堆中的内存并不是规整的,而实一段一段的,使用过的内存和没使用过的内存相互交替的,,那么虚拟机就必须维护一个列表,记录一下那些内存是可以使用的,在分配内存的时候,给对象分配一块足够大的内存,并更新表记录
对于怎么分配内存取决于我们的Java堆中内存的情况,那么Java堆中内存情况又取决于GC是否带有空间压缩整理的能力决定的

我们在分配对象的一个过程是非线程安全的,如果我们正在给A对象分配内存,当我们正要修改指针的指向的时候,CPU时间片用完了,这时B也要分配内存,等B内存分配完成之后,如果A继续先前的状态继续下去,那么这个时候就会出错了。对于这种情况,我们有两个解决方案:
一、对分配内存的动作进行同步处理——实际上虚拟机是采用CAS(比较并交换 compare and swap)+失败重试的方法进行的
二、把分配内存的的动作分配在不同的区域进行操作,即本地线程分配缓冲(Thread Local Allocation Buffer ,TLAB),这个是线程私有的,只有当本地缓冲区用完之后,分配新的内存缓冲区才需要同步锁定

然后就是对对象头进行设置了,例如:这个对象是哪个类的实例、如何才能找到类的元信息,GC年聊分代,偏向锁等等;

分配的内存包括本类和所有父类的实例变量,但不包括任何静态变量。

3.实例变量赋值、执行初始化代码

上面的种种操作,对于虚拟机来讲,一个对象已经创建出来了,但是对于程序员来讲,这才刚刚开始,我们接下来的就是执行我们编写的构造方法,初始化我们的实例变量

实例初始化代码的执行从父类开始,再执行子类的。但在任何类执行初始化代码之前,所有实例变量都已设置完默认值。

4. 垃圾回收机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值