一次性聊透JVM架构设计,就算八股文也得会

简介: 有位小伙伴在我的粉丝群里面问我一个面试题,说面试被问对JVM的理解,不知道怎么回答,今天咱们来聊透,就算是八股文你也得会。另外,往期面试题解析中配套的文档我已经准备好,想获得的可以在我的煮叶简介中找到。

【Java面试】JVM架构设计搞不明白?14年资深架构师带你一次聊透

有位小伙伴在我的粉丝群里面问我一个面试题,说面试被问对JVM的理解,不知道怎么回答,今天咱们来聊透,就算是八股文你也得会。另外,往期面试题解析中配套的文档我已经准备好,想获得的可以在我的煮叶简介中找到。

先来看什么是JVM?

1、什么是JVM

JVM(Java Virtual Machine)其实是一套标准。通过定义虚拟机,像真实计算机一样,能够运行字节码指令。JVM的好处是可以屏蔽操作系统的细节, 使Java可以一次编写,到处运行。

bcb02493a860ea934f474af796d62585.png

实现JVM的厂商有很多,比如Hotspot、JRockit、IBM J9等等。今天我们重点来聊一聊主流的Hotspot,因为Oracle JDK与OpenJDK都是采用HotSpot VM。从源码层面说,它们俩基本上没什么区别。

2、JVM架构设计

下面我给大家详细介绍一下JVM的架构设计,总体来看HotSpot VM 主要由3个核心部分组成:

1、类装载子系统(Class Loader Subsystem)

2、运行时数据区(Runtime Data Areas)

3、执行引擎(Execution Engine)

e84c341c354438a179272c749b136ae2.png

那么Hotspot JVM架构细节和运行机制又是怎样的呢?首先,将编译好的.class文件装载到类加载子系统,它的主要功能是查找并验证类文件、完成相关内存空间的分配和对象赋值。

类文件加载到内存之后由运行时数据区来完成数据存储和数据交换。运行时数据区又分为线程共享内存区和线程隔离内存区。线程共享内存区包括方法区和堆区,它们是程序员能够通过编写代码直接操作的内存区,而线程隔离内存区包括栈区、程序计数器和本地方法栈,它们是完全由JVM来调度的内存区域。

cb34790717c19532b8c0c20d651bf51f.png

首先来看方法区,它的主要功能是存储运行时常量池、字段和方法的元数据和类的的元数据。

e68150db0a3f80bd3acdd763539465f0.png

而堆区呢,主要是用来存储Java对象的实例,也就是我们new的类都存在堆区。

1ca1a01888862665c592daf1cedb8bd1.png

栈区是通过线程的方式运行来加载各种方法。

656738d51b4e47f168326ac6654cd3e2.png

程序计数器呢,是负责保存每个线程执行的方法的地址。

24de4845882b509a9c58fa9f1be69d40.png

本地方法区是负责加载并运行native类型的方法,

2cc747ec665785b6e701943eef1e9b36.png

这样,通过运行时数据区的五个内存区就能完成Java程序程序逻辑的执行和数据交换。接下来看执行引擎,它主要包含即时编辑器和垃圾回收器。

2d9880c5d04568bb6b67d4899c70a633.png

即时编译器,通俗地理解就是用来将字节码翻译成操作系统能够执行的CPU指令,可以通过JVM参数来设置选择解释执行或者是编译执行。

b47a846009c883b564f8016d23fe7b9f.png

所谓解释执行就是直接将字节码作为源程序输入解释执行,不必等待编译器全部编译完成再执行,这样可以省去许多不必要的编译时间。

7ec90f6c67d89eeae135f72f6a045b68.png

而编译执行就是就是由编译程序将目标代码一次性编译成目标程序,再由机器运行,执行效率更高,占用内存资源也更小

e5e811a6022bf2088647d0f026d825f2.png

在Hotspot的实现中默认是两种方式的组合。

垃圾回收器主要负责对运行时数据区的数据进行管理和回收,其实就是对各种垃圾回收算法的实现,总体来说有三种核心算法,分别是复制算法、标记清除算法和标记整理算法,这些算法的选择呢,我们可以通过JVM参数来设置。

48bc623047cdc17db14745daac7b9311.png

最后,来看本地方法接口,也就是JNI技术。我们可以通过JNI来查找并调用C或C++实现的代码,还可以调用操作系统的动态链接库(DLL)等等。

142564aa2a69db4ea19f42bc9bf08b09.png

3、总结

好了,通过对Hotspot架构的分析,相信各位小伙伴已经非常清晰地知道了JVM的运行原理。当然,在实际的开发过程中,我们可以通过配置JVM参数来对JVM进行调优,比如这些参数。

e116d4a7dd22d7d2079236792a6585bf.png

还可以通过一些常见的JDK命令来分析JVM的状态,查找问题的原因从而完成对JVM的调优,比如这些命令。

2db0c4ad9a9490718cf86059ed710969.png

以上就是我对JVM的理解。我是被编程耽误的文艺Tom,如果我的分享对你有帮助,请动动手指一键三连分享给更多的人。关注我,面试不再难!

相关文章
|
8月前
|
存储 算法 Oracle
四、探索JVM架构
四、探索JVM架构
64 2
|
5月前
|
存储 算法 前端开发
JVM架构与主要组件:了解Java程序的运行环境
JVM的架构设计非常精妙,它确保了Java程序的跨平台性和高效执行。通过了解JVM的各个组件,我们可以更好地理解Java程序的运行机制,这对于编写高效且稳定的Java应用程序至关重要。
67 3
|
7月前
|
存储 监控 算法
架构面试题汇总:JVM全套(2024版)
架构面试题汇总:JVM全套(2024版)
|
8月前
|
安全 前端开发 Java
【JVM】<Java虚拟机>JVM架构&各种**虚拟机
【1月更文挑战第26天】【JVM】<Java虚拟机>JVM架构&各种**虚拟机
|
存储 算法 Java
JVM架构和内存管理优化
JVM架构和内存管理优化
|
架构师 Java 应用服务中间件
每天学四小时:Java+Spring+JVM+分布式高并发,架构师指日可待
每天花四小时学马士兵Java、大数据、Spring、Redis、Jvm、分布式、高并发、坦克大战,你会成为高级架构师 适合小白入门到高级,同时适合工作-两年的同学,因为整套课程全程通过项目演变的过程,从传统单机到整合分布式缓存,高井发负载均衡技术数据一致性方案,再到微服务,注册发现,路由熔断,统一配置管理,服务质量管理,中间件技术选型,底层原理源码分析,覆盖JAVA、spring全家桶、kafka. 多种MQ、缓存数据库技术,docker容器k8s部署,只要跟着学,不只会操作,还能领悟技术发展的因果关系让您面试先人一 步!
|
NoSQL Java 应用服务中间件
腾讯架构师推荐架构电子书:多线程+JVM+Nginx+Redis+SpringBoot
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程进而提升整体处理性能。
462 0
|
Arthas 监控 Java
JVM 整体架构及内存调优(三)| 学习笔记
快速学习 JVM 整体架构及内存调优。
JVM 整体架构及内存调优(三)| 学习笔记
|
缓存 Java 编译器
图解JVM整体结构、执行流程以及2种架构模型,你学会了吗?
HotSpot VM 是目前市面上高性能虚拟机的代表作之一。 方法区和堆:多线程共享 虚拟机栈、本地方法栈、程序计数器:每个线程独有一份 执行引擎:包含三部分:解释器,及时编译器(后端编译器),垃圾回收器 它采用解释器与即时编译器并存的架构。 在今天,Java 程序的运行性能早已脱胎换骨,已经达到了可以和 C/C++ 程序一较高下的地步。
|
Oracle 前端开发 Java
小师妹学JVM之:JVM的架构和执行过程
小师妹学JVM之:JVM的架构和执行过程
小师妹学JVM之:JVM的架构和执行过程