-
现在JVM 在很多大厂面试中都有问道,并且在我们实际开发中这个也是对我们实际的开发有重大帮助的,也是你走到高级程序员道路的必修之路。
-
那么我们先看看整体的架构图,然后在把架构图里面的内容一一讲解
-
那么JVM 到底是什么呢? 首先他是一个虚拟机,然后它是运行在操作系统上的,它又硬件没有直接交互。
-
类装载器ClassLoader
- 负责加载class文件,class文件在文件的开头有特定的文件标识,将class文件字节码内容加载到内存中,并将这些内容转换成方法区(Java8 为原空间)中运行时数据结构并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine 决定。(主要加载的类都在以下目录中)
- echo %JAVA_HOME%
- echo %PATH%
- echo %CLASSPATH%
- 类加载器有多少种呢 ? 默认JDK 给我们提供三种
- 虚拟机自带的加载器
- 启动器加载器(Bootstrap)C++
- 扩展类加载器(Extension)Java
- 应用程序类加载器(AppClassLoader)Java也叫系统类加载器,加载当前应用的classload的所有类。
- 自定义加载器
- Java.lang.ClassLoader的子类,用户可以制定类的加载方式。
- 虚拟机自带的加载器
- 双亲委派机制
- 当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次的类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中,只有当父类加载器反馈自己无法完成这个请求的时候(在 它的加载路径下没有找到所需加载Class),子类加载器才会尝试自己去加载。
- 采用双亲委派的一个好处是比如加载位于rt.jar包中的类java.lang.Object,不管是那个加载器加载这个类,最终都委派给顶层的启动类加载器进行加载,这样就算使用不同的类加载器最终得到的都是同一个Object对象。
- 负责加载class文件,class文件在文件的开头有特定的文件标识,将class文件字节码内容加载到内存中,并将这些内容转换成方法区(Java8 为原空间)中运行时数据结构并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine 决定。(主要加载的类都在以下目录中)
-
Execution Engine 执行引擎负责解释命令,提交操作系统执行。
-
Native Interface 本地接口
- 本地接口的作用是融合不同的编程语言为Java所使用,它的初衷是融合C/C++ 程序,Java诞生的时候是C/C++横行的时候,要想立足,必须调用C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native方法,在Execution Engine 执行时加载Native libraies .
- 目前该方法使用的越来越少了,除非是与硬件有关的应用,比如通过Java程序驱动打印机或者Java系统管理生产设备,在企业级应用已经很少见了,因为现在异构领域间的通信很发达,比如可以使用Socket通信,也可以使用Web Service等等,不多做介绍。
-
Native Method Stack
- 它的具体做法是Native Method Stack 中登记native 方法,在Execution Engine执行时加载本地方法库。
-
PC寄存器
- 每个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码(用来存储指向下一条指令的地址,也即将执行),由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以
忽略不记。 - 这块内存区域很小,它是当前线程执行字节码的行号指示器,字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令。
- 如果执行的是一个Native方法,那这个计数器是空的。
- 用以完成分支、循环、跳转、异常处理、线程恢复等基础功能。不会发生内存溢出(OutOfMemory=OOM)错误。
- 每个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码(用来存储指向下一条指令的地址,也即将执行),由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以
-
Methon Area 方法区
- 供各个线程运行时的内存区域的,它存储了每一个类的结构信息,例如运行时常量池(Runtime Constant Pool)、字段和方法数据、构造函数和普通方法的字节码内容。上面讲的是规范,在不同虚拟机里头实现是不一样的,最典型的就是永久代(PermGen space)和元空间(Metespace )But 实例变量存在堆内存中,和方法区无关。
-
Stack 栈
- 栈也叫栈内存,主管Java程序的运行,是在线程创建时创建,它的生命期是跟随线程的生命
JVM 面试考点
最新推荐文章于 2024-04-17 07:18:06 发布
本文详细介绍了JVM的内存结构,包括类装载器、执行引擎、本地接口、方法区、栈、堆等。强调了双亲委派模型在类加载器中的作用,以及堆内存的分代管理,如新生代、老年代和永久代(或元空间)。文章还讨论了JVM内存调优,包括GC算法和JMM内存模型,探讨了如何优化内存使用和理解线程之间的通信。
摘要由CSDN通过智能技术生成