jvm整体运行的流程图详解(超详细)

 

如下图流程图详解。

第一步:程序员写出各种java文件   通过编译器编译成class字节码文件

第二步:然后我们通过tomcat  或者java -jar的形式在linux或windows上运行

第三步:前提安装了jdk   我们的jar或war程序就整体是一个jvm,在运行时会首先去让最顶层的父层 启动类加载器(BootStrap ClassLoader)去java的lib包下加载核心类库。然后通过 Extension ClassLoader 扩展类加载器 在lib/ext下加载扩展类    ,再然后通过Application ClassLoader应用程序类加载器 加载我们自己的java程序中的class字节码文件 。。。。。其中加载过程中会有双亲委派机制,就是当前应用程序类加载器向上层父级扩展类中找寻是否该类应由其执行,扩展类加载器在向上。到达启动类加载器去核心类库中找寻是否是自己的类。如果是则有自己进行类加载进jvm内存方法区中。如果没有则再向下进行委派。直到找到是属于各级加载器自己的类。如果每一层都没有。那么由发起方自己去执行该类(类加载进方法区)

第四部:如果我们是通过tomcat加载的话。tomcat会将应用程序解析,验证,通过自定义类加载加载如tomcat自己的jvm方法区。

第五步:放入方法区的class类会被字节码引擎执行字节码指令进行各种操作(读写),过程中会有程序计数器来记录指令执行的位置。

第六步:执行过程从各个方法也就是线程执行起始,该对象在建立的时候会被放入堆内存中。

第七步:初始化的对象 都会有自己的成员变量,赋完默认值,会将成员变量进行压栈,进入java虚拟机栈中成为栈帧。并且每一个成员变量都在栈内存中指向堆内存的对象。堆栈相互关联。

第八步:垃圾回收时刻监测堆内存中是否有未被栈内存中成员变量指向的对象。如果有,则进行垃圾回收。

第九步:而在方法去的类和栈中的栈帧什么时候被回收呢?首先该类所有的实例化对象都在堆内存中被回收。其次加载该类的类加载器已经被回收,最后对该类的class文件没有任何堆内存的线程或线程中变量引用。这三种情况全部满足,栈和方法区的线程和类都全部被回收了。

 

 

jvm整体运行的流程图详解(超详细)