JVM(Java Virtual Machine):Java虚拟机是Java的核心和基础,用来加载字节码(.class)文件、管理并分配内存、执行垃圾收集。JVM的生命周期分为七个阶段。
一、创建阶段(Creation)
1.为对象分配内存空间。
2.开始构造对象。
3.递归调用其父类的构造函数。
4.进行对象实例初始化与变量初始化。
二、应用阶段(Using)
1.强引用(Strong Reference)
基本上我们使用的都是强引用,除非我们显示的使用软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)。强引用即使不使用了,GC也不会回收它。当空间不足,Java宁愿抛出OutOfMemoryError错误,是程序终止也不回收。
2.软引用(Soft Reference)
具有较强的引用功能。只有当内存不够的时候,才回收这类内存,因此在内存足够的时候,他们通常不被收回。他可以用于实现一些常用资源的缓存,实现cache的功能,保证最大限度的使用内存而不引起OutOfMemory。
3.弱引用(Weak Reference)
弱引用的对象拥有更短暂的生命周期。不管内存空间是否足够,一但发现弱引用就会被回收。
4.虚引用(Phantom Reference)
虚引用的用途较少,主要用于辅助finalize函数的使用。Phantom对象指一些执行完了finalize函数,并且为不可达对象,但是还没有被GC回收的对象。这种对象可以辅助finalize进行一些后期的回收工作,我们通过覆盖Reference的clear()方法,增强资源回收机制的灵活性。虚引用主要适用于以某种比java终结机制更灵活的方式调度pre-mortem清除操作。
三、不可视阶段(Invisible)
当一个对象处于不可视阶段,说明我们在其他区域的代码中已经不可以再引用它,其引用已经消失,例如:本地变量超出了其可视范围。
四、不可达阶段(Unreachable)
处于不可达阶段的对象在虚拟机的对象引用根集合中再也找不到直接或间接的强引用,这些对象一般是所有线程栈中的临时变量,所有已装载的类的静态变量或者是对本地代码接口(JNI)的引用。
五、可收集阶段(Collected)
六、终结阶段(Finalized)
七、释放阶段(Free)
该对象可能处于下面三种情况:
1.回收器发现该对象已不可到达。
2.finalize方法已经被执行。
3.对象空间已被重用。
则说明对象处于可收集阶段、终结阶段、释放阶段。