🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[toc] ## **一、JVM整体结构** > * HotSpot VM是目前市面上高性能虚拟机的代表作之一。 > * 它采用解释器与即时编译器并存的架构。 > * 在今天,Java程序的运行性能早已脱胎换骨,已经达到了可以和C/C++程序一较高下的地步。 > * 本节内容可以配合[脑图](https://naotu.baidu.com/file/d808de875921ab7d0d356119741923c7)进行学习。 首先,JVM的内存结构分为三个部分,类加载子系统、运行时数据区、执行引擎。整体结构如下图: ![image-20200704183436495](http://gitee.com/cowboy2014/cloud2020-config/raw/master//pictures/image-20200704183436495.png) ### 1.1 **类加载子系统** 功能:字节码文件的加载。 #### 双亲委派机制 ### 1.2 **运行时数据区** 运行时数据区中线程共享的内存区域是:方法区、堆; 其中方法区:常量池; 堆:存放新建的对象; #### 方法区 方法区是一个抽象概念。 ![](https://img.kancloud.cn/e8/f9/e8f9ad9f53d4023802e804c04bd3cfe2_788x306.png) JDK8以前,其实现为“永久代”,存储类的元信息、运行时常量池、常量池、静态变量等;JDK8以后,其实现为“元空间”,存储类的元信息、运行时常量池,常量池、静态变量放到了堆中。 > 这里需要注意:元空间代替了永久代,而不是代替了方法区。[【相关资料】](https://www.bilibili.com/video/BV1uQ4y1y7T2) #### **虚拟机栈(Java栈)和本地方法栈有什么区别?** 虚拟机栈又叫做Java栈,这样从字面意义上看已经比较清楚了。Java栈是记录线程执行位置,本地方法栈则是线程记录native方法的程序位置。 ### 1.3 **执行引擎** 执行引擎包含三部分:解释器,JIT及时编译器,垃圾回收器。 JIT的编译过程 ![](https://img.kancloud.cn/b6/da/b6dab3ebc19cf6351f8cb9f3c5a13406_1316x543.png) ## **总结** JVM内存结构用一个详细图描述如下: ![image-20210405174323652](https://gitee.com/cowboy2014/cloud2020-config/raw/master//pictures/image-20210405174323652.png) ## 面试题 ![](https://img.kancloud.cn/50/bf/50bfe26e6ce5ad12594ab80b546ffd6f_1210x260.png) ### class文件,谁负责加载到内存中? 1. 类加载器负责从文件系统或者网络中加载Class文件; 2. 类的运行交给执行引擎决定。 ### 常量池区别 class常量池(静态常量池)、运行时常量池、字符串常量池区别: 1. class常量池中存储的是符号引用,而运行时常量池存储的是被解析之后的直接引用。 2. class常量池存在于class文件中,运行时常量池和字符串常量池是存在于JVM内存中。 3. 运行时常量池具有动态性,java运行期间也可能将新的常量放入池中(String#intern()), 4. 字符串常量池逻辑上属于运行时常量池的一部分,但是它和运行时常量池的区别在于,字符串常量池是全局唯一的,而运行时常量池是每个类一个。 ## 参考学习材料 1. [JVM内存结构和Java内存模型](https://zhuanlan.zhihu.com/p/38348646) 2. [字符串在JVM中如何存放 及常量池技术](https://blog.csdn.net/shimadear/article/details/99708840) 3. [运行时常量池、字符串常量池](https://blog.csdn.net/qq_26719997/article/details/110187881) > 参考教程:https://www.bilibili.com/video/BV1854y1H7nR?p=2