[toc]
## **一、JVM整體結構**
> * HotSpot VM是目前市面上高性能虛擬機的代表作之一。
> * 它采用解釋器與即時編譯器并存的架構。
> * 在今天,Java程序的運行性能早已脫胎換骨,已經達到了可以和C/C++程序一較高下的地步。
> * 本節內容可以配合[腦圖](https://naotu.baidu.com/file/d808de875921ab7d0d356119741923c7)進行學習。
首先,JVM的內存結構分為三個部分,類加載子系統、運行時數據區、執行引擎。整體結構如下圖:

### 1.1 **類加載子系統**
功能:字節碼文件的加載。
#### 雙親委派機制
### 1.2 **運行時數據區**
運行時數據區中線程共享的內存區域是:方法區、堆;
其中方法區:常量池;
堆:存放新建的對象;
#### 方法區
方法區是一個抽象概念。

JDK8以前,其實現為“永久代”,存儲類的元信息、運行時常量池、常量池、靜態變量等;JDK8以后,其實現為“元空間”,存儲類的元信息、運行時常量池,常量池、靜態變量放到了堆中。
> 這里需要注意:元空間代替了永久代,而不是代替了方法區。[【相關資料】](https://www.bilibili.com/video/BV1uQ4y1y7T2)
#### **虛擬機棧(Java棧)和本地方法棧有什么區別?**
虛擬機棧又叫做Java棧,這樣從字面意義上看已經比較清楚了。Java棧是記錄線程執行位置,本地方法棧則是線程記錄native方法的程序位置。
### 1.3 **執行引擎**
執行引擎包含三部分:解釋器,JIT及時編譯器,垃圾回收器。
JIT的編譯過程

## **總結**
JVM內存結構用一個詳細圖描述如下:

## 面試題

### 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工作原理