简单介绍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:一次垃圾回收。

相关推荐
小猫猫猫◍˃ᵕ˂◍4 小时前
miqiu的分布式锁(二):实战——用JMeter验证JVM锁能否解决MySQL超卖问题
jvm·分布式·jmeter
HPF_994 小时前
JVM 简单内存结构及例子
java·jvm
m0_748248945 小时前
猿创征文 【高级篇】Java 进阶之JVM实战
java·开发语言·jvm
失业写写八股文6 小时前
JDK内存模型进化史:三张图看懂方法区实现变革
java·jvm
java熟手21 小时前
面试-JVM:JVM的组成及作用
jvm·面试
扫地僧0091 天前
Java 面试题及答案整理,最新面试题
java·jvm·算法·面试
m0_748251351 天前
java进阶1——JVM
java·开发语言·jvm
钢板兽1 天前
Java后端面试八股文:系统化学习指南,告别零散知识点
java·linux·jvm·redis·后端·mysql·面试
啾啾Fun1 天前
[java基础-JVM篇]2_垃圾收集器与内存分配策略
java·开发语言·jvm