JVM对象从创建到销毁的过程

从创建对象A来谈谈对象的创建到销毁  A a = new A();
1、用户创建了一个对象A,运行时JVM首先会去方法区寻找该对象的类信息,没有则使用类加载器ClassLoader加载A.class字节码文件
过程:类加载过程 
采用双亲委派机制对类进行加载,加载的类信息存放于一块称为方法区的内存空间,除了类信息外,方法区还存放运行时常量池信息
,常量,静态变量;
分三个阶段
加载:
1 -通过一个类的全限定名获取此类的二进制字节流
2- 将这个字节流文件所代表的静态存储结构转化为 方法区的运行时数据结构
3- 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问接口 
链接:
验证
1- 目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全
2.-主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证。
准备
1 - 为类变量(static)分配内存并且设置该类变量的默认初始值
2 - 这里不包含final修饰的static,因为final在编译的时候就会分配好了默认值,准备阶段会显示初始化
3 - 注意:这里不会为实例变量分配初始化,类变量(静态变量)会分配在方法区中,而实例变量会随着对象进入堆中
解析
在编译的时候一个每个java类都会被编译成一个class文件, 但在编译的时候虚拟机并不知道所引用类的地址,多以就用符号引用来代替,而在这个解析阶段就是为了把这个符号引用转化成为真正的地址的阶段。(静态链接)
1 - 将常量池的符号引用转化为直接引用的过程
2 - 符号引用就是一组符号来描述所引用的目标,符号引用的字面量形式明确定义在《java虚拟机规范》的class文件格式中。直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄
3. 解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等。对应常量池中的CONSTANT Class info、CONSTANT Fieldref info、CONSTANT Methodref info等
初始化
1. 初始化阶段就是执行 类构造器方法 <clinit>()</clinit> 的过程
2. 此方法不需定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来。也就是说, 当我们代码中包含static变量的时候,就会有clinit方法
3. <clinit>()</clinit> 方法中的指令按语句在源文件中出现的顺序执行
4. <clinit>()</clinit>不同于类的构造器。(关联:构造器是虚拟机视角下的 <init>()</init>)
5. 若该类具有父类,JVM会保证子类的 <clinit>()</clinit> 执行前,父类的 <clinit>()</clinit> 已经执行完毕
6. 虚拟机必须保证一个类的 <clinit>()</clinit> 方法在多线程下被同步加锁
接着JVM在堆中为新的实例分配内存空间,这个实例持有着指向方法区的的类类型信息的引用,引用指的是方法区中的内存
对象的分配过程
1 - 如果Eden还有内存空间, new的A对象先放在Eden区(此区的大小受限制);
2 - 当Eden区的空间被填满时,程序又需要创建A对象,JVM垃圾回收器将对Eden区进行垃圾回收(Minor GC),将Eden中的不在被其他对象的对象进行销毁;
3 - 然后将Eden中的幸存的对象移动到s0区;
4 - s0区没有被回收的就会移动到s1区;
5 - 注意:触发垃圾回收,s区的幸存的对象会在s0 s1互相移动,并且在这个过程中,年龄要+1;
6 - 在年龄达到一定的数值时会移动到老年代,这个参数 --XX:MaxTenuringThreshold = 来设置
 
JVM进程中,创建线程的同时也创建了一个虚拟机栈,虚拟机栈用来跟踪线程运行中的一些列方法,每调用一个方法就会创建并往栈中
压入一个栈帧,栈帧包含:局部变量表,操作数栈,动态链接,方法返回地址。 a是对A的引用,就存放于栈中,并持有指向堆中A实例的内存地址
JVM根据a引用持有的堆中对象的内存地址,定位到堆中的A实例,堆中实例持有指向方法区的A类型信息的引用。
JVM GC
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个对象从加载到JVM再到被GC清除,经历了如下过程: 1. 类加载:当Java程序使用某个类时,Java虚拟机会先检查该类是否已经被加载,如果没有加载,则会使用类加载器将该类加载到JVM中。在类加载的过程中,JVM会为该类创建一个Class对象,用于表示该类。 2. 对象实例化:当Java程序创建某个类的对象时,JVM会先在堆内存中为该对象分配空间,并初始化对象的各个字段,然后调用该类的构造方法,完成对象的实例化。 3. 对象使用:当Java程序使用某个对象时,可以通过对象的引用来访问对象的各个字段和方法。在对象使用的过程中,JVM会为对象分配内存,并记录对象的引用计数。 4. 垃圾回收:当Java程序不再使用某个对象时,JVM会将该对象标记为垃圾对象,并在适当的时候进行垃圾回收。垃圾回收的过程中,JVM会扫描堆内存中的对象,将不再被引用的对象进行回收,并释放对象占用的内存空间。 5. 对象销毁:当Java程序中某个对象被垃圾回收后,JVM会将该对象从内存中销毁,并将对象占用的内存空间还给操作系统。 总的来说,一个对象从加载到JVM再到被GC清除,经历了类加载、对象实例化、对象使用、垃圾回收和对象销毁过程JVM会根据对象的引用计数和垃圾回收算法来判断对象是否需要进行回收,从而保证堆内存的有效使用和程序的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值