简单介绍JVM

1.什么是JVM?

JVM就是Java虚拟机【Java Virtual Machine】,简称JVM。主要部分包括类加载子系统运行时数据区,执行引擎,本地方法库等,接下来我们一一介绍

2.类加载子系统

JVM中运行的就是我们日常写的JAVA代码,代码经过编译加生成.class文件,在经过类加载子系统加载到内存中,如图:

3.JVM运行时数据区

3.1方法区(内存共享)

存储的就是类对象,包括类方法和对象方法

存储数据是公共的,所有线程都可以访问这个区域

补充:方法区别称

JDK7称为永久代

JDK8及以后称为元空间

补充**:如何区别类方法和对对象方法?**

对象方法调用时会有一个隐式this引用,表示当前对象自己,而类对象全局统一。

3.2堆(内存共享)

用来存放在代码中用new关键字创建的对象。也是JVM中内存使用最大的区域

3.3JAVA虚拟机栈(线程私有)

每创建一个线程都会在内存中创建一个对应的虚拟机栈,栈中存放的是栈帧。

该线程每调用一个方法 虚拟机中就会入栈一个栈帧 ,栈帧中存储的信息与该方法息息相关,主要包括局部变量表,操作站栈,动态连接,方法返回地址 ,如图:

所以当某线程虚拟机栈空了,也就说明该线程中的方法已经执行完毕,反之亦然。

3.4本地方法栈

调用本地方法时使用的栈

3.5程序计数器(线程私有)

用来记录线程当前执行到了哪一行,下次CPU调度时从计数器位置开始执行,(多线程)

搞懂了这些部分分别是做什么的,我们再来说**.class文件时如何被JVM加载并运行**

1.类加载子系统把.class文件加载到运行时数据区。

2.将类对象,类方法和对象方法存在方法区,后续new对象可以直接从这里找到模板,以便进行对象创建操作。

3.new 出来的对象全部放在堆区。

4.创建的每个线程分配一个虚拟机栈,线程中被调用的方法信息记录在栈帧中并依次入栈,可以说栈中存的是线程对方法的调用层级

5.本地方法栈中存的是本地方法的调用层级。

6.程序计数器,记录的是当前线程的执行的行号。

4.JVM类加载过程

4.1加载

通过类的全限定名找到所有的.class文件,加载到内存中

4.2验证

验证.class文件是否符合JVM标准

4.3准备

为静态变量以及静态方法分配内存空间 并按照数据类型设置初始值(例如:int 初始值为0)。

4.4解析

JVM把常量池中的符号引用(例如:int 符号引用为I)替换为真实引用

4.5初始化

执行类的初始化代码(被static修饰的)

4.6使用

使用的也就是刚刚加载的类,所以使用阶段也是new对象,执行构造方法和父类构造方法的阶段。

4.7卸载

程序停止时--从JVM中卸载。

5.双亲委派模型

双亲委派模型是Java类加载器的一种工作模式,该模式主要用于JVM类加载阶段,用于保证JDK中定义的类不被恶意修改 。以下是它的工作图:

具体流程:

1.当创建一个类时,先从应用加载器开始向上转发,一直到启动加载器

2启动加载器在自己路径下找这个类,若找到则加载,没有则向下转发给扩展加载器

3.扩展加载器在自己路径下找这个类,若找到则加载,没有则向下转发给应用程序加载器

4.应用程序加载器在自己路径下找这个类,找到则加载,找不到则报异常或错误

6.垃圾回收

说完了类的加载和卸载,我们来讲对象是如何被回收的,毕竟我们前面讲堆区是JVM中使用内存最大的区域,为什么最大?因为程线程中创建的各种对象多呗,有时一个对象被创建可能仅仅使用一次就不用了,对于这些对象我们要及时回收,不然放那不管是占内存的。

那垃圾回收中的"垃圾"其实也就是不再使用的对象,垃圾回收也就是回收对象占用的堆内存。

所以问题就在于如何标识对象是否死亡?

6.1引用计数算法

核心思想:对于堆中对象,引用一次计数加一,消除引用一次计数减一,当堆中对象引用计数为0时表示该对象已经死亡。

该算法缺点:内存泄漏 ----堆中某个对象对应的内存空间永远也回收不了。

举个例子:

经过上诉一番操作,t1对象和t2对象虽然还未死,但是:t1.instance所引用的对象永远也访问不了,那这个内存就回收不了,所以这种算法我们一般不用。

6.2可达性分析算法

核心思想:通过某一个根节点(GC root)出发访问不到某个对象,则判定该对象死亡,本轮GC标记,下轮GC回收内存空间。

6.3标记-清除算法

判定哪些对象已死亡需要回收我们OK了,那么如何回收死亡对象呢?

首先登场的时标记-清除算法,工作原理如下图:

GC:一次垃圾回收。

相关推荐
程序猿chen4 小时前
《JVM考古现场(十五):熵火燎原——从量子递归到热寂晶壁的代码涅槃》
java·jvm·git·后端·java-ee·区块链·量子计算
Song5 小时前
JVM 学习计划表(2025 版)
jvm·学习
皮卡兔子屋6 小时前
java虚拟机---JVM
java·jvm
可爱的霸王龙8 小时前
JVM——模型分析、回收机制
java·jvm
喻米粒062213 小时前
RabbitMQ消息相关
java·jvm·spring boot·spring·spring cloud·sentinel·java-rabbitmq
Aphelios38015 小时前
Java全栈面试宝典:线程机制与Spring IOC容器深度解析
java·开发语言·jvm·学习·rbac
bing_1581 天前
JVM 每个区域分别存储什么数据?
java·jvm
zzhz9251 天前
Jmeter(性能指标、指标插件、测试问题、面试题、讲解稿)
java·jvm·jmeter
hweiyu001 天前
从JVM到分布式锁:高并发架构设计的六把密钥
jvm·redis·分布式·mysql·etcd
小杨xyyyyyyy1 天前
JVM - 垃圾回收器常见问题
java·jvm·面试