JVM生命周期

一、前言

今天给大家介绍一下JVM的生命周期!

  JVM(Java Virtual Machine):Java虚拟机是Java的核心和基础,用来加载字节码(.class)文件、管理并分配内存、执行垃圾收集。
JVM的生命周期分为七个阶段。

二、首先分析两个概念

   JVM实例和JVM执行引擎实例

(1)JVM实例对应了一个独立运行的java程序,它是进程级别。
(2)JVM执行引擎实例则对应了属于用户运行程序的线程,它是线程级别的。

三、JVM的生命周期

(1)JVM实例的诞生:当启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点。 

(2)JVM实例的运行 main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以标明自己创建的线程是守护线程。 

(3)JVM实例的消亡:当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出。

四、JVM生命周期的七个阶段

1、创建阶段(Creation)

为对象分配内存空间。
开始构造对象。
递归调用其父类的构造函数。
进行对象实例初始化与变量初始化。

2、应用阶段(Using)

强引用(Strong Reference)
基本上我们使用的都是强引用,除非我们显示的使用软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)。强引用即使不使用了,GC也不会回收它。当空间不足,Java宁愿抛出OutOfMemoryError错误,是程序终止也不回收。

软引用(Soft Reference)
具有较强的引用功能。只有当内存不够的时候,才回收这类内存,因此在内存足够的时候,他们通常不被收回。他可以用于实现一些常用资源的缓存,实现cache的功能,保证最大限度的使用内存而不引起OutOfMemory。

弱引用(Weak Reference)
弱引用的对象拥有更短暂的生命周期。不管内存空间是否足够,一但发现弱引用就会被回收。

虚引用(Phantom Reference)
虚引用的用途较少,主要用于辅助finalize函数的使用。Phantom对象指一些执行完了finalize函数,并且为不可达对象,但是还没有被GC回收的对象。这种对象可以辅助finalize进行一些后期的回收工作,我们通过覆盖Reference的clear()方法,增强资源回收机制的灵活性。虚引用主要适用于以某种比java终结机制更灵活的方式调度pre-mortem清除操作。

3、不可视阶段(Invisible)

  当一个对象处于不可视阶段,说明我们在其他区域的代码中已经不可以再引用它,其引用已经消失,例如:本地变量超出了其可视范围。

4、不可达阶段(Unreachable)

  处于不可达阶段的对象在虚拟机的对象引用根集合中再也找不到直接或间接的强引用,这些对象一般是所有线程栈中的临时变量,所有已装载的类的静态变量或者是对本地代码接口(JNI)的引用。

5、可收集阶段(Collected)

6、终结阶段(Finalized)

7、释放阶段(Free)

该对象可能处于下面三种情况:

回收器发现该对象已不可到达。
finalize方法已经被执行。
对象空间已被重用。

则说明对象处于可收集阶段、终结阶段、释放阶段