JVM整体运行原理图

8 篇文章 0 订阅
本文详细介绍了Java程序的打包、JVM类加载过程,包括启动类加载器、扩展类加载器和应用程序类加载器的工作原理。类加载遵循双亲委派模型,依次经历加载、验证、准备、解析和初始化阶段。在内存管理方面,讲解了方法区、堆内存、Java虚拟机栈的使用,以及垃圾回收机制如何处理无引用的对象。最后,探讨了线程执行字节码指令的过程及局部变量与对象在内存中的存储位置。
摘要由CSDN通过智能技术生成

在这里插入图片描述

1.

第一步,我们把写好的.java文件进行打包成jar包或war包,打包过程中会把.java编译成.class字节码文件。

2.

我们JVM需要运行.class文件,通过类加载器把这些文件加载到JVM中,供后续代码运行来使用。
类加载器遵从双亲委派模型。
在这里插入图片描述

应用程序类加载器会问扩展类加载器是不是你的,扩展类加载器会问上层启动类加载器是不是你的类。如果启动类加载器有,则进行类加载到jvm内存方法区。如果没有就向下委派给扩展类加载器,去寻找是不是它的类,如果不是继续向下委派给应用程序类加载器。如果每一层都没有。那么由发起方自己去执行该类(类加载进方法区)

1.启动类加载器(BootStrap ClassLoader)去java的lib包下核心类库中寻找需要加载的类。
2.Extension ClassLoader 扩展类加载器 在lib/ext下加载扩展类。
3.Application ClassLoader应用程序类加载器 加载我们自己的java程序中的class字节码文件。

一个类从加载到使用,会经历以下过程:
加载 -> 验证 -> 准备 -> 初始化 -> 使用 -> 卸载

(1)验证阶段
根据java虚拟机规范,来校验你加载进来的.class文件中的内容是否符合规范。
(2)准备阶段
在这里插入图片描述
如图,当ReplicaManager.class文件加载到内存中后,进行校验是否符合规范,接着进行准备工作。准备工作就是给ReplicaManager分配一定的内存空间,然后给它的flushInterval类变量(static修饰的变量)分配空间,设置默认的初始值0。
(3)解析阶段
实际上把符号引用替换为直接引用。
(4)初始化阶段
在这里插入图片描述
如图,在准备阶段,我们只是给flushInterval类变量给了内存空间并设了默认值0。我们在准备阶段并没有赋值,在初始化阶段才进行赋值。还有如果有继承父类,首先会初始化父类。

3.

放入方法区的class类会被字节码执行引擎去执行字节码指令来进行各种操作。在执行字节码指令时,每个线程有专门程序计数器来记录当前执行的字节码指令的位置

4.在这里插入图片描述

main线程执行main()方法里的代码,此时有个replicaManager局部变量,它就是保存在java虚拟机栈中。它new了一个对象,这个对象保存在堆内存中,并且replicaManager局部变量指向这个对象。如图
在这里插入图片描述

线程每执行一个方法都会创建一个栈帧,栈帧里就有这个方法的局部变量表 、操作数栈、动态链接、方法出口等东西。
比如main线程执行main()方法,会创建一个栈帧压入java虚拟机栈中。在这里插入图片描述
再代码往后执行loadReplicasFromDisk方法时,会创建栈帧压入虚拟机栈。
在这里插入图片描述
当loadReplicasFromDisk方法执行完毕后,会把此方法的栈帧从java虚拟机栈弹出。

5.

从上述中,当loadReplicasFromDisk方法执行完毕后,会把此方法的栈帧从java虚拟机栈弹出。此时没有任何变量指向堆内存的ReplicaManager对象,而我们的内存资源是有限的,不能不管它。
此时就引入了jvm的垃圾回收机制,它是一个后台自动运行的线程,定期的扫描jvm堆内存的各个对象是否被引用,如果没被引用就会回收。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值