---
category: Java
tag:
- JVM
---
# Java å
ååºå详解
å¦ææ²¡æç¹æ®è¯´æï¼é½æ¯éå¯¹çæ¯ HotSpot èææºã
## åå¨åé¢ (常è§é¢è¯é¢)
### åºæ¬é®é¢
- **ä»ç»ä¸ Java å
ååºåï¼è¿è¡æ¶æ°æ®åºï¼**
- **Java 对象çå建è¿ç¨ï¼äºæ¥ï¼å»ºè®®è½é»ååºæ¥å¹¶ä¸è¦ç¥éæ¯ä¸æ¥èææºåäºä»ä¹ï¼**
- **对象ç访é®å®ä½çä¸¤ç§æ¹å¼ï¼å¥æåç´æ¥æéä¸¤ç§æ¹å¼ï¼**
### æå±é®é¢
- **String ç±»å叏鿱 **
- **8 ç§åºæ¬ç±»åçå
è£
ç±»å叏鿱 **
## ä¸ æ¦è¿°
å¯¹äº Java ç¨åºåæ¥è¯´ï¼å¨èææºèªå¨å
åç®¡çæºå¶ä¸ï¼ä¸åéè¦å C/C++ç¨åºå¼åç¨åºåè¿æ ·ä¸ºæ¯ä¸ä¸ª new æä½å»å对åºç delete/free æä½ï¼ä¸å®¹æåºç°å
åæ³æ¼åå
åæº¢åºé®é¢ãæ£æ¯å 为 Java ç¨åºåæå
åæ§å¶æå©äº¤ç» Java èææºï¼ä¸æ¦åºç°å
åæ³æ¼åæº¢åºæ¹é¢çé®é¢ï¼å¦æä¸äºè§£èææºæ¯ææ ·ä½¿ç¨å
åçï¼é£ä¹ææ¥é误å°ä¼æ¯ä¸ä¸ªé常è°å·¨çä»»å¡ã
## äº è¿è¡æ¶æ°æ®åºå
Java èææºå¨æ§è¡ Java ç¨åºçè¿ç¨ä¸ä¼æå®ç®¡ççå
åååæè¥å¹²ä¸ªä¸åçæ°æ®åºåãJDK 1.8 åä¹åççæ¬ç¥æä¸åï¼ä¸é¢ä¼ä»ç»å°ã
**JDK 1.8 ä¹åï¼**

**JDK 1.8 ï¼**

**线ç¨ç§æçï¼**
- ç¨åºè®¡æ°å¨
- èææºæ
- æ¬å°æ¹æ³æ
**线ç¨å
±äº«çï¼**
- å
- æ¹æ³åº
- ç´æ¥å
å (éè¿è¡æ¶æ°æ®åºçä¸é¨å)
### 2.1 ç¨åºè®¡æ°å¨
ç¨åºè®¡æ°å¨æ¯ä¸åè¾å°çå
å空é´ï¼å¯ä»¥ç使¯å½åçº¿ç¨ææ§è¡çåèç çè¡å·æç¤ºå¨ã**åèç è§£éå¨å·¥ä½æ¶éè¿æ¹åè¿ä¸ªè®¡æ°å¨ç弿¥éåä¸ä¸æ¡éè¦æ§è¡çåèç æä»¤ï¼åæ¯ã循ç¯ã跳转ãå¼å¸¸å¤çãçº¿ç¨æ¢å¤çåè½é½éè¦ä¾èµè¿ä¸ªè®¡æ°å¨æ¥å®æã**
å¦å¤ï¼**为äºçº¿ç¨åæ¢åè½æ¢å¤å°æ£ç¡®çæ§è¡ä½ç½®ï¼æ¯æ¡çº¿ç¨é½éè¦æä¸ä¸ªç¬ç«çç¨åºè®¡æ°å¨ï¼å线ç¨ä¹é´è®¡æ°å¨äºä¸å½±åï¼ç¬ç«åå¨ï¼æä»¬ç§°è¿ç±»å
ååºå为â线ç¨ç§æâçå
åã**
**ä»ä¸é¢çä»ç»ä¸æä»¬ç¥éç¨åºè®¡æ°å¨ä¸»è¦æä¸¤ä¸ªä½ç¨ï¼**
1. åèç è§£éå¨éè¿æ¹åç¨åºè®¡æ°å¨æ¥ä¾æ¬¡è¯»åæä»¤ï¼ä»èå®ç°ä»£ç çæµç¨æ§å¶ï¼å¦ï¼é¡ºåºæ§è¡ãéæ©ã循ç¯ãå¼å¸¸å¤çã
2. å¨å¤çº¿ç¨çæ
åµä¸ï¼ç¨åºè®¡æ°å¨ç¨äºè®°å½å½åçº¿ç¨æ§è¡çä½ç½®ï¼ä»èå½çº¿ç¨è¢«åæ¢åæ¥çæ¶åè½å¤ç¥é该线ç¨ä¸æ¬¡è¿è¡å°åªå¿äºã
**注æï¼ç¨åºè®¡æ°å¨æ¯å¯ä¸ä¸ä¸ªä¸ä¼åºç° `OutOfMemoryError` çå
ååºåï¼å®ççå½å¨æéç线ç¨çå建èå建ï¼éç线ç¨çç»æèæ»äº¡ã**
### 2.2 Java èææºæ
**ä¸ç¨åºè®¡æ°å¨ä¸æ ·ï¼Java èææºæ 乿¯çº¿ç¨ç§æçï¼å®ççå½å¨æå线ç¨ç¸åï¼æè¿°çæ¯ Java æ¹æ³æ§è¡çå
忍¡åï¼æ¯æ¬¡æ¹æ³è°ç¨çæ°æ®é½æ¯éè¿æ ä¼ éçã**
**Java å
åå¯ä»¥ç²ç³çåºå为å å
åï¼Heapï¼åæ å
å (Stack)ï¼å
¶ä¸æ å°±æ¯ç°å¨è¯´çèææºæ ï¼æè
说æ¯èææºæ ä¸å±é¨åé表é¨åã** ï¼å®é
ä¸ï¼Java èææºæ æ¯ç±ä¸ä¸ªä¸ªæ å¸§ç»æï¼èæ¯ä¸ªæ 帧ä¸é½æ¥æï¼å±é¨åé表ãæä½æ°æ ã卿龿¥ãæ¹æ³åºå£ä¿¡æ¯ãï¼
**å±é¨åé表主è¦åæ¾äºç¼è¯æå¯ç¥çåç§æ°æ®ç±»å**ï¼booleanãbyteãcharãshortãintãfloatãlongãdoubleï¼ã**对象å¼ç¨**ï¼reference ç±»åï¼å®ä¸åäºå¯¹è±¡æ¬èº«ï¼å¯è½æ¯ä¸ä¸ªæå对象起å§å°åçå¼ç¨æéï¼ä¹å¯è½æ¯æåä¸ä¸ªä»£è¡¨å¯¹è±¡ç奿æå
¶ä»ä¸æ¤å¯¹è±¡ç¸å
³çä½ç½®ï¼ã
**Java èææºæ ä¼åºç°ä¸¤ç§é误ï¼`StackOverFlowError` å `OutOfMemoryError`ã**
- **`StackOverFlowError`ï¼** è¥ Java èææºæ çå
å大å°ä¸å
è®¸å¨ææ©å±ï¼é£ä¹å½çº¿ç¨è¯·æ±æ çæ·±åº¦è¶
è¿å½å Java èææºæ çæå¤§æ·±åº¦çæ¶åï¼å°±æåº StackOverFlowError é误ã
- **`OutOfMemoryError`ï¼** Java èææºæ çå
å大å°å¯ä»¥å¨ææ©å±ï¼ å¦æèææºå¨å¨ææ©å±æ æ¶æ æ³ç³è¯·å°è¶³å¤çå
å空é´ï¼åæåº`OutOfMemoryError`å¼å¸¸ã

Java èææºæ 乿¯çº¿ç¨ç§æçï¼æ¯ä¸ªçº¿ç¨é½æåèªç Java èææºæ ï¼èä¸éç线ç¨çå建èå建ï¼éç线ç¨çæ»äº¡èæ»äº¡ã
**æ©å±ï¼é£ä¹æ¹æ³/彿°å¦ä½è°ç¨ï¼**
Java æ å¯ä»¥ç±»æ¯æ°æ®ç»æä¸æ ï¼Java æ ä¸ä¿åç主è¦å
å®¹æ¯æ å¸§ï¼æ¯ä¸æ¬¡å½æ°è°ç¨é½ä¼æä¸ä¸ªå¯¹åºçæ 帧被åå
¥ Java æ ï¼æ¯ä¸ä¸ªå½æ°è°ç¨ç»æåï¼é½ä¼æä¸ä¸ªæ 帧被弹åºã
Java æ¹æ³æä¸¤ç§è¿åæ¹å¼ï¼
1. return è¯å¥ã
2. æåºå¼å¸¸ã
ä¸ç®¡åªç§è¿åæ¹å¼é½ä¼å¯¼è´æ 帧被弹åºã
### 2.3 æ¬å°æ¹æ³æ
åèææºæ æåæ¥çä½ç¨é常ç¸ä¼¼ï¼åºå«æ¯ï¼ **èææºæ ä¸ºèææºæ§è¡ Java æ¹æ³ ï¼ä¹å°±æ¯åèç ï¼æå¡ï¼èæ¬å°æ¹æ³æ åä¸ºèææºä½¿ç¨å°ç Native æ¹æ³æå¡ã** å¨ HotSpot èææºä¸å Java èææºæ åäºä¸ºä¸ã
æ¬å°æ¹æ³è¢«æ§è¡çæ¶åï¼å¨æ¬å°æ¹æ³æ ä¹ä¼å建ä¸ä¸ªæ 帧ï¼ç¨äºåæ¾è¯¥æ¬å°æ¹æ³çå±é¨åé表ãæä½æ°æ ã卿龿¥ãåºå£ä¿¡æ¯ã
æ¹æ³æ§è¡å®æ¯åç¸åºçæ 帧ä¹ä¼åºæ å¹¶éæ¾å
å空é´ï¼ä¹ä¼åºç° `StackOverFlowError` å `OutOfMemoryError` 两ç§é误ã
### 2.4 å
Java èææºæç®¡ççå
å䏿大çä¸åï¼Java å æ¯ææçº¿ç¨å
±äº«çä¸åå
ååºåï¼å¨èææºå¯å¨æ¶å建ã**æ¤å
ååºåçå¯ä¸ç®çå°±æ¯åæ¾å¯¹è±¡å®ä¾ï¼å 乿æç对象å®ä¾ä»¥åæ°ç»é½å¨è¿éåé
å
åã**
Java ä¸çä¸âå ä¹âææç对象é½å¨å ä¸åé
ï¼ä½æ¯ï¼éç JIT ç¼è¯å¨çåå±ä¸éé¸åæææ¯éæ¸æçï¼æ ä¸åé
ãæ éæ¿æ¢ä¼åææ¯å°ä¼å¯¼è´ä¸äºå¾®å¦çååï¼ææç对象é½åé
å°å ä¸ä¹æ¸æ¸åå¾ä¸é£ä¹âç»å¯¹âäºãä» JDK 1.7 å¼å§å·²ç»é»è®¤å¼å¯éé¸åæï¼å¦ææäºæ¹æ³ä¸ç对象å¼ç¨æ²¡æè¢«è¿åæè
æªè¢«å¤é¢ä½¿ç¨ï¼ä¹å°±æ¯æªéé¸åºå»ï¼ï¼é£ä¹å¯¹è±¡å¯ä»¥ç´æ¥å¨æ ä¸åé
å
åã
Java å æ¯å徿¶éå¨ç®¡çç主è¦åºåï¼å æ¤ä¹è¢«ç§°ä½**GC å ï¼Garbage Collected Heapï¼**ãä»åå¾åæ¶çè§åº¦ï¼ç±äºç°å¨æ¶éå¨åºæ¬é½éç¨å代å徿¶éç®æ³ï¼æä»¥ Java å è¿å¯ä»¥ç»åä¸ºï¼æ°ç代åè年代ï¼åç»è´ä¸ç¹æï¼Eden 空é´ãFrom SurvivorãTo Survivor 空é´çã**è¿ä¸æ¥ååçç®çæ¯æ´å¥½å°åæ¶å
åï¼æè
æ´å¿«å°åé
å
åã**
å¨ JDK 7 çæ¬å JDK 7 çæ¬ä¹åï¼å å
å被é常å为ä¸é¢ä¸é¨åï¼
1. æ°ç代å
å(Young Generation)
2. èç代(Old Generation)
3. æ°¸ç代(Permanent Generation)

JDK 8 çæ¬ä¹åæ¹æ³åºï¼HotSpot çæ°¸ä¹
代ï¼è¢«å½»åºç§»é¤äºï¼JDK1.7 就已ç»å¼å§äºï¼ï¼åè代乿¯å
空é´ï¼å
空é´ä½¿ç¨çæ¯ç´æ¥å
åã

**ä¸å¾æç¤ºç Eden åºã两个 Survivor åºé½å±äºæ°ç代ï¼ä¸ºäºåºåï¼è¿ä¸¤ä¸ª Survivor åºåæç
§é¡ºåºè¢«å½å为 from å toï¼ï¼ä¸é´ä¸å±å±äºè年代ã**
大é¨åæ
åµï¼å¯¹è±¡é½ä¼é¦å
å¨ Eden åºååé
ï¼å¨ä¸æ¬¡æ°ç代åå¾åæ¶åï¼å¦æå¯¹è±¡è¿åæ´»ï¼åä¼è¿å
¥ s0 æè
s1ï¼å¹¶ä¸å¯¹è±¡çå¹´é¾è¿ä¼å 1(Eden åº->Survivor åºå对象çåå§å¹´é¾å为 1)ï¼å½å®çå¹´é¾å¢å å°ä¸å®ç¨åº¦ï¼é»è®¤ä¸º 15 å²ï¼ï¼å°±ä¼è¢«æåå°è年代ä¸ã对象æåå°è年代çå¹´é¾éå¼ï¼å¯ä»¥éè¿åæ° `-XX:MaxTenuringThreshold` æ¥è®¾ç½®ã
> **ð ä¿®æ£ï¼åè§ï¼[issue552](https://github.com/Snailclimb/JavaGuide/issues/552)ï¼** ï¼âHotspot éåææå¯¹è±¡æ¶ï¼æç
§å¹´é¾ä»å°å°å¤§å¯¹å
¶æå ç¨ç大å°è¿è¡ç´¯ç§¯ï¼å½ç´¯ç§¯çæä¸ªå¹´é¾å¤§å°è¶
è¿äº survivor åºçä¸åæ¶ï¼åè¿ä¸ªå¹´é¾å MaxTenuringThreshold 䏿´å°çä¸ä¸ªå¼ï¼ä½ä¸ºæ°çæåå¹´é¾éå¼âã
>
> **卿年é¾è®¡ç®ç代ç å¦ä¸**
>
> ```c++
> uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) {
> //survivor_capacityæ¯survivor空é´ç大å°
> size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);
> size_t total = 0;
> uint age = 1;
> while (age < table_size) {
> total += sizes[age];//sizesæ°ç»æ¯æ¯ä¸ªå¹´é¾æ®µå¯¹è±¡å¤§å°
> if (total > desired_survivor_size) break;
> age++;
> }
> uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;
> ...
> }
> ```
å è¿éæå®¹æåºç°çå°±æ¯ OutOfMemoryError é误ï¼å¹¶ä¸åºç°è¿ç§é误ä¹åç表ç°å½¢å¼è¿ä¼æå ç§ï¼æ¯å¦ï¼
1. **`java.lang.OutOfMemoryError: GC Overhead Limit Exceeded`** ï¼ å½ JVM è±å¤ªå¤æ¶é´æ§è¡åå¾åæ¶å¹¶ä¸åªè½åæ¶å¾å°çå ç©ºé´æ¶ï¼å°±ä¼åçæ¤é误ã
2. **`java.lang.OutOfMemoryError: Java heap space`** :åå¦å¨å建æ°ç对象æ¶, å å
åä¸ç空é´ä¸è¶³ä»¥åæ¾æ°å建ç对象, å°±ä¼å¼åæ¤é误ã(åé
ç½®çæå¤§å å
åæå
³ï¼ä¸åå¶äºç©çå
å大å°ãæå¤§å å
åå¯éè¿`-Xmx`åæ°é
ç½®ï¼è¥æ²¡æç¹å«é
ç½®ï¼å°ä¼ä½¿ç¨é»è®¤å¼ï¼è¯¦è§ï¼[Default Java 8 max heap size](https://stackoverflow.com/questions/28272923/default-xmxsize-in-java-8-max-heap-size))
3. ......
### 2.5 æ¹æ³åº
æ¹æ³åºä¸ Java å 䏿 ·ï¼æ¯å个线ç¨å
±äº«çå
ååºåï¼å®ç¨äºåå¨å·²è¢«èææºå è½½ç类信æ¯ã常éãéæåéã峿¶ç¼è¯å¨ç¼è¯åç代ç çæ°æ®ãè½ç¶ **Java èææºè§èææ¹æ³åºæè¿°ä¸ºå çä¸ä¸ªé»è¾é¨å**ï¼ä½æ¯å®å´æä¸ä¸ªå«åå«å **Non-Heapï¼éå ï¼**ï¼ç®çåºè¯¥æ¯ä¸ Java å åºå弿¥ã
æ¹æ³åºä¹è¢«ç§°ä¸ºæ°¸ä¹
代ãå¾å¤äººé½ä¼å䏿¸
æ¹æ³åºåæ°¸ä¹
代çå
³ç³»ï¼ä¸ºæ¤æä¹æ¥é
äºæç®ã
#### 2.5.1 æ¹æ³åºåæ°¸ä¹
代çå
³ç³»
> ãJava èææºè§èãåªæ¯è§å®äºææ¹æ³åºè¿ä¹ä¸ªæ¦å¿µåå®çä½ç¨ï¼å¹¶æ²¡æè§å®å¦ä½å»å®ç°å®ãé£ä¹ï¼å¨ä¸åç JVM 䏿¹æ³åºçå®ç°è¯å®æ¯ä¸åçäºã **æ¹æ³åºåæ°¸ä¹
代çå
³ç³»å¾å Java 䏿¥å£åç±»çå
³ç³»ï¼ç±»å®ç°äºæ¥å£ï¼èæ°¸ä¹
ä»£å°±æ¯ HotSpot èææºå¯¹èææºè§è䏿¹æ³åºçä¸ç§å®ç°æ¹å¼ã** ä¹å°±æ¯è¯´ï¼æ°¸ä¹
ä»£æ¯ HotSpot çæ¦å¿µï¼æ¹æ³åºæ¯ Java èææºè§èä¸çå®ä¹ï¼æ¯ä¸ç§è§èï¼èæ°¸ä¹
代æ¯ä¸ç§å®ç°ï¼ä¸ä¸ªæ¯æ åä¸ä¸ªæ¯å®ç°ï¼å
¶ä»çèææºå®ç°å¹¶æ²¡ææ°¸ä¹
代è¿ä¸è¯´æ³ã
#### 2.5.2 常ç¨åæ°
JDK 1.8 ä¹åæ°¸ä¹
ä»£è¿æ²¡è¢«å½»åºç§»é¤çæ¶åé常éè¿ä¸é¢è¿äºåæ°æ¥è°èæ¹æ³åºå¤§å°
```java
-XX:PermSize=N //æ¹æ³åº (æ°¸ä¹
代) åå§å¤§å°
-XX:MaxPermSize=N //æ¹æ³åº (æ°¸ä¹
代) æå¤§å¤§å°,è¶
è¿è¿ä¸ªå¼å°ä¼æåº OutOfMemoryError å¼å¸¸:java.lang.OutOfMemoryError: PermGen
```
ç¸å¯¹èè¨ï¼å徿¶éè¡ä¸ºå¨è¿ä¸ªåºåæ¯æ¯è¾å°åºç°çï¼ä½å¹¶éæ°æ®è¿å
¥æ¹æ³åºåå°±âæ°¸ä¹
åå¨âäºã
JDK 1.8 çæ¶åï¼æ¹æ³åºï¼HotSpot çæ°¸ä¹
代ï¼è¢«å½»åºç§»é¤äºï¼JDK1.7 就已ç»å¼å§äºï¼ï¼åè代乿¯å
空é´ï¼å
空é´ä½¿ç¨çæ¯ç´æ¥å
åã
ä¸é¢æ¯ä¸äºå¸¸ç¨åæ°ï¼
```java
-XX:MetaspaceSize=N //设置 Metaspace çåå§ï¼åæå°å¤§å°ï¼
-XX:MaxMetaspaceSize=N //设置 Metaspace çæå¤§å¤§å°
```
䏿°¸ä¹
代å¾å¤§çä¸åå°±æ¯ï¼å¦æä¸æå®å¤§å°çè¯ï¼éçæ´å¤ç±»çå建ï¼èææºä¼èå°½ææå¯ç¨çç³»ç»å
åã
#### 2.5.3 为ä»ä¹è¦å°æ°¸ä¹
代 (PermGen) æ¿æ¢ä¸ºå
ç©ºé´ (MetaSpace) å¢?
ä¸å¾æ¥èªãæ·±å
¥çè§£ Java èææºã第 3 ç 2.2.5

1. æ´ä¸ªæ°¸ä¹
代æä¸ä¸ª JVM æ¬èº«è®¾ç½®çåºå®å¤§å°ä¸éï¼æ æ³è¿è¡è°æ´ï¼èå
空é´ä½¿ç¨çæ¯ç´æ¥å
åï¼åæ¬æºå¯ç¨å
åçéå¶ï¼è½ç¶å
空é´ä»æ§å¯è½æº¢åºï¼ä½æ¯æ¯åæ¥åºç°çå ç伿´å°ã
> å½å
ç©ºé´æº¢åºæ¶ä¼å¾å°å¦ä¸éè¯¯ï¼ `java.lang.OutOfMemoryError: MetaSpace`
ä½ å¯ä»¥ä½¿ç¨ `-XXï¼MaxMetaspaceSize` æ å¿è®¾ç½®æå¤§å
空é´å¤§å°ï¼é»è®¤å¼ä¸º unlimitedï¼è¿æå³çå®åªåç³»ç»å
åçéå¶ã`-XXï¼MetaspaceSize` è°æ´æ å¿å®ä¹å
空é´çåå§å¤§å°å¦ææªæå®æ¤æ å¿ï¼å Metaspace å°æ ¹æ®è¿è¡æ¶çåºç¨ç¨åºéæ±å¨æå°éæ°è°æ´å¤§å°ã
2. å
空é´éé¢åæ¾çæ¯ç±»çå
æ°æ®ï¼è¿æ ·å è½½å¤å°ç±»çå
æ°æ®å°±ä¸ç± `MaxPermSize` æ§å¶äº, èç±ç³»ç»çå®é
å¯ç¨ç©ºé´æ¥æ§å¶ï¼è¿æ ·è½å è½½ç类就æ´å¤äºã
3. å¨ JDK8ï¼åå¹¶ HotSpot å JRockit çä»£ç æ¶, JRockit 仿¥æ²¡æä¸ä¸ªå«æ°¸ä¹
代çä¸è¥¿, åå¹¶ä¹å就没æå¿
è¦é¢å¤ç设置è¿ä¹ä¸ä¸ªæ°¸ä¹
代çå°æ¹äºã
### 2.6 è¿è¡æ¶å¸¸éæ±
è¿è¡æ¶å¸¸éæ± æ¯æ¹æ³åºçä¸é¨åãClass æä»¶ä¸é¤äºæç±»ççæ¬ãåæ®µãæ¹æ³ãæ¥å£çæè¿°ä¿¡æ¯å¤ï¼è¿æå¸¸éæ± è¡¨ï¼ç¨äºåæ¾ç¼è¯æçæçåç§åé¢éå符å·å¼ç¨ï¼
æ¢ç¶è¿è¡æ¶å¸¸éæ± æ¯æ¹æ³åºçä¸é¨åï¼èªç¶åå°æ¹æ³åºå
åçéå¶ï¼å½å¸¸éæ± æ æ³åç³è¯·å°å
åæ¶ä¼æåº OutOfMemoryError é误ã
~~**JDK1.7 åä¹åçæ¬ç JVM å·²ç»å°è¿è¡æ¶å¸¸éæ± ä»æ¹æ³åºä¸ç§»äºåºæ¥ï¼å¨ Java å ï¼Heapï¼ä¸å¼è¾äºä¸ååºååæ¾è¿è¡æ¶å¸¸éæ± ã**~~
> **ð ä¿®æ£ï¼åè§ï¼[issue747](https://github.com/Snailclimb/JavaGuide/issues/747)ï¼[reference](https://blog.csdn.net/q5706503/article/details/84640762)ï¼** ï¼
>
> 1. **JDK1.7 ä¹åè¿è¡æ¶å¸¸éæ± é»è¾å
å«åç¬¦ä¸²å¸¸éæ± 忾卿¹æ³åº, æ¤æ¶ hotspot èææºå¯¹æ¹æ³åºçå®ç°ä¸ºæ°¸ä¹
代**
> 2. **JDK1.7 åç¬¦ä¸²å¸¸éæ± è¢«ä»æ¹æ³åºæ¿å°äºå ä¸, è¿é没ææå°è¿è¡æ¶å¸¸éæ± ,ä¹å°±æ¯è¯´åç¬¦ä¸²å¸¸éæ± 被åç¬æ¿å°å ,è¿è¡æ¶å¸¸éæ± å©ä¸çä¸è¥¿è¿å¨æ¹æ³åº, ä¹å°±æ¯ hotspot ä¸çæ°¸ä¹
代** ã
> 3. **JDK1.8 hotspot ç§»é¤äºæ°¸ä¹
代ç¨å
空é´(Metaspace)åè代ä¹, è¿æ¶ååç¬¦ä¸²å¸¸éæ± è¿å¨å , è¿è¡æ¶å¸¸éæ± è¿å¨æ¹æ³åº, åªä¸è¿æ¹æ³åºçå®ç°ä»æ°¸ä¹
代åæäºå
空é´(Metaspace)**
ç¸å
³é®é¢ï¼JVM 叏鿱 ä¸åå¨çæ¯å¯¹è±¡è¿æ¯å¼ç¨å¢ï¼ï¼ https://www.zhihu.com/question/57109429/answer/151717241 by RednaxelaFX
### 2.7 ç´æ¥å
å
**ç´æ¥å
å并䏿¯èææºè¿è¡æ¶æ°æ®åºçä¸é¨åï¼ä¹ä¸æ¯èææºè§èä¸å®ä¹çå
ååºåï¼ä½æ¯è¿é¨åå
åä¹è¢«é¢ç¹å°ä½¿ç¨ãèä¸ä¹å¯è½å¯¼è´ OutOfMemoryError é误åºç°ã**
JDK1.4 䏿°å å
¥ç **NIO(New Input/Output) ç±»**ï¼å¼å
¥äºä¸ç§åºäº**ééï¼Channelï¼**ä¸**ç¼ååºï¼Bufferï¼**ç I/O æ¹å¼ï¼å®å¯ä»¥ç´æ¥ä½¿ç¨ Native 彿°åºç´æ¥åé
å å¤å
åï¼ç¶åéè¿ä¸ä¸ªåå¨å¨ Java å ä¸ç DirectByteBuffer 对象ä½ä¸ºè¿åå
åçå¼ç¨è¿è¡æä½ãè¿æ ·å°±è½å¨ä¸äºåºæ¯ä¸æ¾èæé«æ§è½ï¼å 为**é¿å
äºå¨ Java å å Native å ä¹é´æ¥åå¤å¶æ°æ®**ã
æ¬æºç´æ¥å
åçåé
ä¸ä¼åå° Java å çéå¶ï¼ä½æ¯ï¼æ¢ç¶æ¯å
åå°±ä¼åå°æ¬æºæ»å
å大å°ä»¥åå¤çå¨å¯»å空é´çéå¶ã
## ä¸ HotSpot èææºå¯¹è±¡æ¢ç§
éè¿ä¸é¢çä»ç»æä»¬å¤§æ¦ç¥éäºèææºçå
åæ
åµï¼ä¸é¢æä»¬æ¥è¯¦ç»çäºè§£ä¸ä¸ HotSpot èææºå¨ Java å ä¸å¯¹è±¡åé
ãå¸å±å访é®çå
¨è¿ç¨ã
### 3.1 对象çå建
ä¸å¾ä¾¿æ¯ Java 对象çå建è¿ç¨ï¼æå»ºè®®æå¥½æ¯è½é»ååºæ¥ï¼å¹¶ä¸è¦ææ¡æ¯ä¸æ¥å¨åä»ä¹ã

#### Step1:ç±»å è½½æ£æ¥
èææºéå°ä¸æ¡ new æä»¤æ¶ï¼é¦å
å°å»æ£æ¥è¿ä¸ªæä»¤çåæ°æ¯å¦è½å¨å¸¸éæ± ä¸å®ä½å°è¿ä¸ªç±»ç符å·å¼ç¨ï¼å¹¶ä¸æ£æ¥è¿ä¸ªç¬¦å·å¼ç¨ä»£è¡¨çç±»æ¯å¦å·²è¢«å è½½è¿ãè§£æååå§åè¿ãå¦ææ²¡æï¼é£å¿
é¡»å
æ§è¡ç¸åºçç±»å è½½è¿ç¨ã
#### Step2:åé
å
å
å¨**ç±»å è½½æ£æ¥**éè¿åï¼æ¥ä¸æ¥èææºå°ä¸ºæ°ç对象**åé
å
å**ã对象æéçå
å大å°å¨ç±»å è½½å®æå便å¯ç¡®å®ï¼ä¸ºå¯¹è±¡åé
空é´çä»»å¡çåäºæä¸åç¡®å®å¤§å°çå
åä» Java å ä¸åååºæ¥ã**åé
æ¹å¼**æ **âæé碰æâ** å **â空é²å表â** 两ç§ï¼**éæ©åªç§åé
æ¹å¼ç± Java å æ¯å¦è§æ´å³å®ï¼è Java å æ¯å¦è§æ´åç±æéç¨çå徿¶é卿¯å¦å¸¦æå缩æ´çåè½å³å®**ã
**å
ååé
çä¸¤ç§æ¹å¼ï¼ï¼è¡¥å
å
容ï¼éè¦ææ¡ï¼**
鿩以ä¸ä¸¤ç§æ¹å¼ä¸çåªä¸ç§ï¼åå³äº Java å å
忝å¦è§æ´ãè Java å å
忝å¦è§æ´ï¼åå³äº GC æ¶éå¨çç®æ³æ¯"æ è®°-æ¸
é¤"ï¼è¿æ¯"æ è®°-æ´ç"ï¼ä¹ç§°ä½"æ è®°-å缩"ï¼ï¼å¼å¾æ³¨æçæ¯ï¼å¤å¶ç®æ³å
å乿¯è§æ´ç

**å
ååé
å¹¶åé®é¢ï¼è¡¥å
å
容ï¼éè¦ææ¡ï¼**
å¨åå»ºå¯¹è±¡çæ¶åæä¸ä¸ªå¾éè¦çé®é¢ï¼å°±æ¯çº¿ç¨å®å
¨ï¼å 为å¨å®é
å¼åè¿ç¨ä¸ï¼å建对象æ¯å¾é¢ç¹çäºæ
ï¼ä½ä¸ºèææºæ¥è¯´ï¼å¿
é¡»è¦ä¿è¯çº¿ç¨æ¯å®å
¨çï¼é常æ¥è®²ï¼èææºéç¨ä¸¤ç§æ¹å¼æ¥ä¿è¯çº¿ç¨å®å
¨ï¼
- **CAS+失败éè¯ï¼** CAS æ¯ä¹è§éçä¸ç§å®ç°æ¹å¼ãæè°ä¹è§éå°±æ¯ï¼æ¯æ¬¡ä¸å éèæ¯å设没æå²çªèå»å®ææé¡¹æä½ï¼å¦æå 为å²çªå¤±è´¥å°±éè¯ï¼ç´å°æå为æ¢ã**èææºéç¨ CAS é
ä¸å¤±è´¥éè¯çæ¹å¼ä¿è¯æ´æ°æä½çååæ§ã**
- **TLABï¼** 为æ¯ä¸ä¸ªçº¿ç¨é¢å
å¨ Eden åºåé
ä¸åå¿å
åï¼JVM å¨ç»çº¿ç¨ä¸ç对象åé
å
åæ¶ï¼é¦å
å¨ TLAB åé
ï¼å½å¯¹è±¡å¤§äº TLAB ä¸çå©ä½å
åæ TLAB çå
åå·²ç¨å°½æ¶ï¼åéç¨ä¸è¿°ç CAS è¿è¡å
ååé
#### Step3:åå§åé¶å¼
å
ååé
宿åï¼èææºéè¦å°åé
å°çå
å空é´é½åå§å为é¶å¼ï¼ä¸å
æ¬å¯¹è±¡å¤´ï¼ï¼è¿ä¸æ¥æä½ä¿è¯äºå¯¹è±¡çå®ä¾åæ®µå¨ Java 代ç ä¸å¯ä»¥ä¸èµåå§å¼å°±ç´æ¥ä½¿ç¨ï¼ç¨åºè½è®¿é®å°è¿äºåæ®µçæ°æ®ç±»åæå¯¹åºçé¶å¼ã
#### Step4:设置对象头
åå§åé¶å¼å®æä¹åï¼**èææºè¦å¯¹å¯¹è±¡è¿è¡å¿
è¦ç设置**ï¼ä¾å¦è¿ä¸ªå¯¹è±¡æ¯åªä¸ªç±»çå®ä¾ãå¦ä½æè½æ¾å°ç±»çå
æ°æ®ä¿¡æ¯ã对象çåå¸ç ã对象ç GC å代年é¾çä¿¡æ¯ã **è¿äºä¿¡æ¯åæ¾å¨å¯¹è±¡å¤´ä¸ã** å¦å¤ï¼æ ¹æ®èææºå½åè¿è¡ç¶æçä¸åï¼å¦æ¯å¦å¯ç¨ååéçï¼å¯¹è±¡å¤´ä¼æä¸åç设置æ¹å¼ã
#### Step5:æ§è¡ init æ¹æ³
å¨ä¸é¢å·¥ä½é½å®æä¹åï¼ä»èææºçè§è§æ¥çï¼ä¸ä¸ªæ°ç对象已ç»äº§çäºï¼ä½ä» Java ç¨åºçè§è§æ¥çï¼å¯¹è±¡å建æåå¼å§ï¼`