[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
- 前言
- 第一部分 计算机网络与操作系统
- 大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?怎么处理?
- 性能占用
- 第二部分 Java基础
- 2-1 JVM
- JVM整体结构
- 方法区
- JVM的生命周期
- 堆对象结构
- 垃圾回收
- 调优案例
- 类加载机制
- 执行引擎
- 类文件结构
- 2-2 多线程
- 线程状态
- 锁与阻塞
- 悲观锁与乐观锁
- 阻塞队列
- ConcurrentHashMap
- 线程池
- 线程框架
- 彻底搞懂AQS
- 2-3 Spring框架基础
- Spring注解
- Spring IoC 和 AOP 的理解
- Spring工作原理
- 2-4 集合框架
- 死磕HashMap
- 第三部分 高级编程
- Socket与NIO
- 缓冲区
- Bybuffer
- BIO、NIO、AIO
- Netty的工作原理
- Netty高性能原因
- Rabbitmq
- mq消息可靠性是怎么保障的?
- 认证授权
- 第四部分 数据存储
- 第1章 mysql篇
- MySQL主从一致性
- Mysql的数据组织方式
- Mysql性能优化
- 数据库中的乐观锁与悲观锁
- 深度分页
- 从一条SQL语句看Mysql的工作流程
- 第2章 Redis
- Redis缓存
- redis key过期策略
- 数据持久化
- 基于Redis分布式锁的实现
- Redis高可用
- 第3章 Elasticsearch
- 全文查询为什么快
- battle with mysql
- 第五部分 数据结构与算法
- 常见算法题
- 基于数组实现的一个队列
- 第六部分 真实面试案例
- 初级开发面试材料
- 答案部分
- 现场编码
- 第七部分 面试官角度
- 第八部分 计算机基础
- 第九部分 微服务
- OpenFeign工作原理