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