JVM详解

1.什么是JVM以及JVM的作用

JVM 是 Java Virtual Machine 的简称,意为 Java虚拟机。
虚拟机是指通过软件模拟的具有完整硬件功能的、运⾏在⼀个完全隔离的环境中的完整计算机系统。

2.JVM运行流程

程序在执行之前要把java代码转换成字节码(.class文件) , JVM首先需要把字节码通过一定的方式类加载器 把文件加载到内存中运行时数据区,将字节码翻译成底层系统指令再交由CPU去执行。

JVM主要通过以下4个部分来执行Java程序:

1.类加载器

2.运行时数据区

3.执行引擎

4.本地库接口

3.Java运行时数据区

1.方法区(内存共享)

保存的就是类对象(new 对象的模版)

因为存放的是公共的数据,那么所有的线程都可以访问这个区域。

2.堆(内存共享)

Test t1 = new Test();

new 出来的对象就放在堆区

在代码中使用new关键创建的对象,全都在堆区(内存空间)

3.Java虚拟机栈(线程私有)

Java虚拟机栈的作用:生命周期和线程相同

每创建一个线程都会在内存中创建一个与之对应的Java虚拟机栈

线程与线程之间工作内存是隔离的

每调用一个方法,就把这个方法压到栈顶,执行完了就出栈,栈空了对应线程就结束了。

4.本地方法栈

调用本地方法时使用的栈

5.程序计数器(线程私有)与线程有对应关系

记录当前线程执行到哪一行了,下次CPU重新调度回来的时候再从这里继续执行。

JVM类加载的过程(重点)

1.加载

在当前的classpath(根目录)下找到所有的.class文件,读取到内存中

2.验证

验证.class是否符合JVM的规范

3.准备

public static int count = 0

为类中定义的静态变量分配内存并设置变量初始值 (这个初始值是变量类型的初始值,不是变量的值)

4.解析

Java虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程

把字节码中的符号引用和真实的内存进行了解析关联

5.初始化

执行代码中真正的复制操作

6.使用

new 对象的过程,执行构造方法,以及父类的构造方法

7.卸载

程序停止时从JVM中卸载

4.双亲委派模型

请介绍一下双亲委派模型?

说说Java有哪些类加载器?

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

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

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

4.应用程序加载器在自己的路径中找到类并加载。

破坏双亲委派模型

Java对外提供了SPI(Service Provider Interface ,服务提供接口)机制实现JDBC,由不同的数据库厂商自己实现,使用的是子类加载器来加载,在加载的时候就破坏了双亲委派模型。

5.死亡对象的判断算法

1.引用计数算法

对堆中创建出来的对象,有一个引用它,它的计数器就加1,但是存在内存无法释放的问题

比如:

Test tset1 和Test tset2

test1的成员变量指向test2

此时如果把test1置为null,那么test1成员变量对test2的引用导致的计数器加1就得不到消除

2.可达性分析算法

从一系列的"GC Roots"的对象作为起始点,从这些节点向下探索,搜索走路的路径为"引用链",当一个对象没有任何引用链,那这个对象就是不可用的

6.垃圾回收相关

1.标记清除算法

存在的问题:可用的内存碎片化,如果此时需要一大片空间,就不好处理

2.复制算法

程序在运行的时候,只使用一半,另一半空闲

当进行垃圾回收的时候,就把区域1中存活的对象全部按顺序复制到区域2中,然后把区域1中所有对象都清楚,每次回收重复这个操作

3.标记整理算法

每次回收的时候存活的对象都向一端整理

4.分代算法(JVM采用,重点)

垃圾回收的过程

1.所有对象创建后都在新生代的EDEN区

2.当发生第一轮GC的时候,将存活的对象放到幸存者区中(from区),把EDEN区中的内存全部清空

3.从第二轮开始,每次GC都会把EDEN区和from区的存活对象放到to区

4.s1和s2进行交换位置

5.当经历一轮GC之后,对象没有被回收,则年龄加1(长大一岁)保存在对象中

6.当对象的年龄到了15岁之后,就会被移到老年代。

7.垃圾回收器

垃圾回收器是垃圾回收算法的具体实现

1.串行

2.并行

3.CMS

初始标记:仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,需要STW

并发标记:进行GC Roots Tracing 的过程

重新标记:为了修正并发标记期间因用户继续运作而导致标记产生变动的那一部分对象的标记记录。这个过程一般比初始标记稍长,但比并发标记短,需要STW

并发清楚:并发清楚阶段会清楚对象

相关推荐
阿沁QWQ11 小时前
C/C++内存管理
jvm
用户84913717547161 天前
生产级故障排查实战:从制造 OOM 到 IDEA Profiler 深度破案
java·jvm
爱学java的ptt1 天前
jvm笔记
jvm·笔记
DKPT2 天前
ZGC和G1收集器相比哪个更好?
java·jvm·笔记·学习·spring
低客的黑调2 天前
为你的项目选择一个适合的[垃圾收集器]
java·jvm·算法
xu_yule2 天前
Linux_14(多线程)线程控制+C++多线程
java·开发语言·jvm
豆奶特浓62 天前
Java面试生死局:谢飞机遭遇在线教育场景,从JVM、Spring Security到AI Agent,他能飞吗?
java·jvm·微服务·ai·面试·spring security·分布式事务
Boop_wu2 天前
[Java EE] 多线程进阶(JUC)(2)
java·jvm·算法