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

**JDK 1.8**ï¼

**线ç¨ç§æçï¼**
- ç¨åºè®¡æ°å¨
- èææºæ
- æ¬å°æ¹æ³æ
**线ç¨å
±äº«çï¼**
- å
- æ¹æ³åº
- ç´æ¥å
å (éè¿è¡æ¶æ°æ®åºçä¸é¨å)
Java èææºè§è对äºè¿è¡æ¶æ°æ®åºåçè§å®æ¯ç¸å½å®½æ¾çã以å 为ä¾ï¼å å¯ä»¥æ¯è¿ç»ç©ºé´ï¼ä¹å¯ä»¥ä¸è¿ç»ãå ç大å°å¯ä»¥åºå®ï¼ä¹å¯ä»¥å¨è¿è¡æ¶æéæ©å± ãèææºå®ç°è
å¯ä»¥ä½¿ç¨ä»»ä½åå¾åæ¶ç®æ³ç®¡çå ï¼çè³å®å
¨ä¸è¿è¡å徿¶é乿¯å¯ä»¥çã
### ç¨åºè®¡æ°å¨
ç¨åºè®¡æ°å¨æ¯ä¸åè¾å°çå
å空é´ï¼å¯ä»¥ç使¯å½åçº¿ç¨ææ§è¡çåèç çè¡å·æç¤ºå¨ãåèç è§£éå¨å·¥ä½æ¶éè¿æ¹åè¿ä¸ªè®¡æ°å¨ç弿¥éåä¸ä¸æ¡éè¦æ§è¡çåèç æä»¤ï¼åæ¯ã循ç¯ã跳转ãå¼å¸¸å¤çãçº¿ç¨æ¢å¤çåè½é½éè¦ä¾èµè¿ä¸ªè®¡æ°å¨æ¥å®æã
å¦å¤ï¼ä¸ºäºçº¿ç¨åæ¢åè½æ¢å¤å°æ£ç¡®çæ§è¡ä½ç½®ï¼æ¯æ¡çº¿ç¨é½éè¦æä¸ä¸ªç¬ç«çç¨åºè®¡æ°å¨ï¼å线ç¨ä¹é´è®¡æ°å¨äºä¸å½±åï¼ç¬ç«åå¨ï¼æä»¬ç§°è¿ç±»å
ååºå为â线ç¨ç§æâçå
åã
ä»ä¸é¢çä»ç»ä¸æä»¬ç¥éäºç¨åºè®¡æ°å¨ä¸»è¦æä¸¤ä¸ªä½ç¨ï¼
- åèç è§£éå¨éè¿æ¹åç¨åºè®¡æ°å¨æ¥ä¾æ¬¡è¯»åæä»¤ï¼ä»èå®ç°ä»£ç çæµç¨æ§å¶ï¼å¦ï¼é¡ºåºæ§è¡ãéæ©ã循ç¯ãå¼å¸¸å¤çã
- å¨å¤çº¿ç¨çæ
åµä¸ï¼ç¨åºè®¡æ°å¨ç¨äºè®°å½å½åçº¿ç¨æ§è¡çä½ç½®ï¼ä»èå½çº¿ç¨è¢«åæ¢åæ¥çæ¶åè½å¤ç¥é该线ç¨ä¸æ¬¡è¿è¡å°åªå¿äºã
â ï¸ æ³¨æï¼ç¨åºè®¡æ°å¨æ¯å¯ä¸ä¸ä¸ªä¸ä¼åºç° `OutOfMemoryError` çå
ååºåï¼å®ççå½å¨æéç线ç¨çå建èå建ï¼éç线ç¨çç»æèæ»äº¡ã
### Java èææºæ
ä¸ç¨åºè®¡æ°å¨ä¸æ ·ï¼Java èææºæ ï¼åæç®ç§°æ ï¼ä¹æ¯çº¿ç¨ç§æçï¼å®ççå½å¨æå线ç¨ç¸åï¼éç线ç¨çå建èå建ï¼éç线ç¨çæ»äº¡èæ»äº¡ã
æ ç»å¯¹ç®ç䏿¯ JVM è¿è¡æ¶æ°æ®åºåçä¸ä¸ªæ ¸å¿ï¼é¤äºä¸äº Native æ¹æ³è°ç¨æ¯éè¿æ¬å°æ¹æ³æ å®ç°ç(åé¢ä¼æå°)ï¼å
¶ä»ææç Java æ¹æ³è°ç¨é½æ¯éè¿æ æ¥å®ç°çï¼ä¹éè¦åå
¶ä»è¿è¡æ¶æ°æ®åºåæ¯å¦ç¨åºè®¡æ°å¨é
åï¼ã
æ¹æ³è°ç¨çæ°æ®éè¦éè¿æ è¿è¡ä¼ éï¼æ¯ä¸æ¬¡æ¹æ³è°ç¨é½ä¼æä¸ä¸ªå¯¹åºçæ 帧被åå
¥æ ä¸ï¼æ¯ä¸ä¸ªæ¹æ³è°ç¨ç»æåï¼é½ä¼æä¸ä¸ªæ 帧被弹åºã
æ ç±ä¸ä¸ªä¸ªæ å¸§ç»æï¼èæ¯ä¸ªæ 帧ä¸é½æ¥æï¼å±é¨åé表ãæä½æ°æ ã卿龿¥ãæ¹æ³è¿åå°åãåæ°æ®ç»æä¸çæ 类似ï¼ä¸¤è
齿¯å
è¿ååºçæ°æ®ç»æï¼åªæ¯æåºæ åå
¥æ ä¸¤ç§æä½ã

**å±é¨åé表** 主è¦åæ¾äºç¼è¯æå¯ç¥çåç§æ°æ®ç±»åï¼booleanãbyteãcharãshortãintãfloatãlongãdoubleï¼ã对象å¼ç¨ï¼reference ç±»åï¼å®ä¸åäºå¯¹è±¡æ¬èº«ï¼å¯è½æ¯ä¸ä¸ªæå对象起å§å°åçå¼ç¨æéï¼ä¹å¯è½æ¯æåä¸ä¸ªä»£è¡¨å¯¹è±¡ç奿æå
¶ä»ä¸æ¤å¯¹è±¡ç¸å
³çä½ç½®ï¼ã

**æä½æ°æ ** 主è¦ä½ä¸ºæ¹æ³è°ç¨çä¸è½¬ç«ä½¿ç¨ï¼ç¨äºåæ¾æ¹æ³æ§è¡è¿ç¨ä¸äº§ççä¸é´è®¡ç®ç»æãå¦å¤ï¼è®¡ç®è¿ç¨ä¸äº§çç临æ¶åéä¹ä¼æ¾å¨æä½æ°æ ä¸ã
**卿龿¥** ä¸»è¦æå¡ä¸ä¸ªæ¹æ³éè¦è°ç¨å
¶ä»æ¹æ³çåºæ¯ãClass æä»¶ç叏鿱 éä¿åæå¤§éç符å·å¼ç¨æ¯å¦æ¹æ³å¼ç¨ç符å·å¼ç¨ãå½ä¸ä¸ªæ¹æ³è¦è°ç¨å
¶ä»æ¹æ³ï¼éè¦å°å¸¸éæ± ä¸æåæ¹æ³ç符å·å¼ç¨è½¬å为å
¶å¨å
åå°åä¸çç´æ¥å¼ç¨ã卿龿¥çä½ç¨å°±æ¯ä¸ºäºå°ç¬¦å·å¼ç¨è½¬æ¢ä¸ºè°ç¨æ¹æ³çç´æ¥å¼ç¨ï¼è¿ä¸ªè¿ç¨ä¹è¢«ç§°ä¸º **å¨æè¿æ¥** ã

æ 空é´è½ç¶ä¸æ¯æ éçï¼ä½ä¸è¬æ£å¸¸è°ç¨çæ
åµä¸æ¯ä¸ä¼åºç°é®é¢çãä¸è¿ï¼å¦æå½æ°è°ç¨é·å
¥æ é循ç¯çè¯ï¼å°±ä¼å¯¼è´æ ä¸è¢«åå
¥å¤ªå¤æ 帧èå ç¨å¤ªå¤ç©ºé´ï¼å¯¼è´æ 空é´è¿æ·±ãé£ä¹å½çº¿ç¨è¯·æ±æ çæ·±åº¦è¶
è¿å½å Java èææºæ çæå¤§æ·±åº¦çæ¶åï¼å°±æåº `StackOverFlowError` é误ã
Java æ¹æ³æä¸¤ç§è¿åæ¹å¼ï¼ä¸ç§æ¯ return è¯å¥æ£å¸¸è¿åï¼ä¸ç§æ¯æåºå¼å¸¸ãä¸ç®¡åªç§è¿åæ¹å¼ï¼é½ä¼å¯¼è´æ 帧被弹åºãä¹å°±æ¯è¯´ï¼ **æ 帧éçæ¹æ³è°ç¨èå建ï¼éçæ¹æ³ç»æèéæ¯ãæ è®ºæ¹æ³æ£å¸¸å®æè¿æ¯å¼å¸¸å®æé½ç®ä½æ¹æ³ç»æã**
é¤äº `StackOverFlowError` é误ä¹å¤ï¼æ è¿å¯è½ä¼åºç°`OutOfMemoryError`é误ï¼è¿æ¯å ä¸ºå¦ææ çå
å大å°å¯ä»¥å¨ææ©å±ï¼ å¦æèææºå¨å¨ææ©å±æ æ¶æ æ³ç³è¯·å°è¶³å¤çå
å空é´ï¼åæåº`OutOfMemoryError`å¼å¸¸ã
ç®åæ»ç»ä¸ä¸ç¨åºè¿è¡ä¸æ å¯è½ä¼åºç°ä¸¤ç§é误ï¼
- **`StackOverFlowError`ï¼** è¥æ çå
å大å°ä¸å
è®¸å¨ææ©å±ï¼é£ä¹å½çº¿ç¨è¯·æ±æ çæ·±åº¦è¶
è¿å½å Java èææºæ çæå¤§æ·±åº¦çæ¶åï¼å°±æåº `StackOverFlowError` é误ã
- **`OutOfMemoryError`ï¼** 妿æ çå
å大å°å¯ä»¥å¨ææ©å±ï¼ å¦æèææºå¨å¨ææ©å±æ æ¶æ æ³ç³è¯·å°è¶³å¤çå
å空é´ï¼åæåº`OutOfMemoryError`å¼å¸¸ã

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

**JDK 8 çæ¬ä¹å PermGen(æ°¸ä¹
代) 已被 Metaspace(å
空é´) å代ï¼å
空é´ä½¿ç¨çæ¯æ¬å°å
åã** ï¼æä¼å¨æ¹æ³åºè¿é¨åå
容详ç»ä»ç»å°ï¼ã
大é¨åæ
åµï¼å¯¹è±¡é½ä¼é¦å
å¨ 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. ......
### æ¹æ³åº
æ¹æ³åºå±äºæ¯ JVM è¿è¡æ¶æ°æ®åºåçä¸åé»è¾åºåï¼æ¯å个线ç¨å
±äº«çå
ååºåã
ãJava èææºè§èãåªæ¯è§å®äºææ¹æ³åºè¿ä¹ä¸ªæ¦å¿µåå®çä½ç¨ï¼æ¹æ³åºå°åºè¦å¦ä½å®ç°é£å°±æ¯èææºèªå·±è¦èèçäºæ
äºãä¹å°±æ¯è¯´ï¼å¨ä¸åçèææºå®ç°ä¸ï¼æ¹æ³åºçå®ç°æ¯ä¸åçã
å½èææºè¦ä½¿ç¨ä¸ä¸ªç±»æ¶ï¼å®éè¦è¯»åå¹¶è§£æ Class æä»¶è·åç¸å
³ä¿¡æ¯ï¼åå°ä¿¡æ¯åå
¥å°æ¹æ³åºãæ¹æ³åºä¼åå¨å·²è¢«èææºå è½½ç **类信æ¯ãåæ®µä¿¡æ¯ãæ¹æ³ä¿¡æ¯ã常éãéæåéã峿¶ç¼è¯å¨ç¼è¯åç代ç ç¼åçæ°æ®**ã
**æ¹æ³åºåæ°¸ä¹
代以åå
ç©ºé´æ¯ä»ä¹å
³ç³»å¢ï¼** æ¹æ³åºåæ°¸ä¹
代以åå
空é´çå
³ç³»å¾å Java 䏿¥å£åç±»çå
³ç³»ï¼ç±»å®ç°äºæ¥å£ï¼è¿éç类就å¯ä»¥ç使¯æ°¸ä¹
代åå
空é´ï¼æ¥å£å¯ä»¥ç使¯æ¹æ³åºï¼ä¹å°±æ¯è¯´æ°¸ä¹
代以åå
ç©ºé´æ¯ HotSpot èææºå¯¹èææºè§è䏿¹æ³åºç两ç§å®ç°æ¹å¼ãå¹¶ä¸ï¼æ°¸ä¹
ä»£æ¯ JDK 1.8 ä¹åçæ¹æ³åºå®ç°ï¼JDK 1.8 å以忹æ³åºçå®ç°åæäºå
空é´ã

**为ä»ä¹è¦å°æ°¸ä¹
代 (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 仿¥æ²¡æä¸ä¸ªå«æ°¸ä¹
代çä¸è¥¿, åå¹¶ä¹å就没æå¿
è¦é¢å¤ç设置è¿ä¹ä¸ä¸ªæ°¸ä¹
代çå°æ¹äºã
**æ¹æ³åºå¸¸ç¨åæ°æåªäºï¼**
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 çæå¤§å¤§å°
```
䏿°¸ä¹
代å¾å¤§çä¸åå°±æ¯ï¼å¦æä¸æå®å¤§å°çè¯ï¼éçæ´å¤ç±»çå建ï¼èææºä¼èå°½ææå¯ç¨çç³»ç»å
åã
### è¿è¡æ¶å¸¸éæ±
Class æä»¶ä¸é¤äºæç±»ççæ¬ãåæ®µãæ¹æ³ãæ¥å£çæè¿°ä¿¡æ¯å¤ï¼è¿æç¨äºåæ¾ç¼è¯æçæçåç§åé¢éï¼Literalï¼å符å·å¼ç¨ï¼Symbolic Referenceï¼ç **叏鿱 表(Constant Pool Table)** ã
åé¢éæ¯æºä»£ç ä¸çåºå®å¼ç表示æ³ï¼å³éè¿å颿们就è½ç¥éå
¶å¼çå«ä¹ãåé¢éå
æ¬æ´æ°ãæµ®ç¹æ°åå符串åé¢éã常è§ç符å·å¼ç¨å
æ¬ç±»ç¬¦å·å¼ç¨ãåæ®µç¬¦å·å¼ç¨ãæ¹æ³ç¬¦å·å¼ç¨ãæ¥å£æ¹æ³ç¬¦å·ã
ãæ·±å
¥çè§£ Java èææºã7.34 è第ä¸ç对符å·å¼ç¨åç´æ¥å¼ç¨çè§£éå¦ä¸ï¼

叏鿱 表ä¼å¨ç±»å è½½å忾尿¹æ³åºçè¿è¡æ¶å¸¸éæ± ä¸ã
è¿è¡æ¶å¸¸éæ± çåè½ç±»ä¼¼äºä¼ ç»ç¼ç¨è¯è¨ç符å·è¡¨ï¼å°½ç®¡å®å
å«äºæ¯å
¸å符å·è¡¨æ´å¹¿æ³çæ°æ®ã
æ¢ç¶è¿è¡æ¶å¸¸éæ± æ¯æ¹æ³åºçä¸é¨åï¼èªç¶åå°æ¹æ³åºå
åçéå¶ï¼å½å¸¸éæ± æ æ³åç³è¯·å°å
åæ¶ä¼æåº `OutOfMemoryError` é误ã
### åç¬¦ä¸²å¸¸éæ±
**åç¬¦ä¸²å¸¸éæ± ** æ¯ JVM ä¸ºäºæåæ§è½ååå°å
åæ¶èé对å符串ï¼String ç±»ï¼ä¸é¨å¼è¾çä¸ååºåï¼ä¸»è¦ç®çæ¯ä¸ºäºé¿å
å符串çéå¤å建ã
```java
// å¨å ä¸å建å符串对象âabâ
// å°å符串对象âabâçå¼ç¨ä¿åå¨åç¬¦ä¸²å¸¸éæ± ä¸
String aa = "ab";
// ç´æ¥è¿ååç¬¦ä¸²å¸¸éæ± ä¸å符串对象âabâçå¼ç¨
String bb = "ab";
System.out.println(aa==bb);// true
```
HotSpot èææºä¸åç¬¦ä¸²å¸¸éæ± çå®ç°æ¯ `src/hotspot/share/classfile/stringTable.cpp` ,`StringTable` å¯ä»¥ç®åç解为ä¸ä¸ªåºå®å¤§å°ç`HashTable` ï¼å®¹é为 `StringTableSize`ï¼å¯ä»¥éè¿ `-XX:StringTableSize` åæ°æ¥è®¾ç½®ï¼ï¼ä¿åçæ¯å符串ï¼keyï¼å å符串对象çå¼ç¨ï¼valueï¼çæ å°å
³ç³»ï¼å符串对象çå¼ç¨æåå ä¸çå符串对象ã
JDK1.7 ä¹åï¼åç¬¦ä¸²å¸¸éæ± 忾卿°¸ä¹
代ãJDK1.7 åç¬¦ä¸²å¸¸éæ± åéæåé仿°¸ä¹
代移å¨äº Java å ä¸ã


**JDK 1.7 为ä»ä¹è¦å°åç¬¦ä¸²å¸¸éæ± ç§»å¨å°å ä¸ï¼**
ä¸»è¦æ¯å 为永ä¹
ä»£ï¼æ¹æ³åºå®ç°ï¼ç GC åæ¶æç太ä½ï¼åªæå¨æ´å æ¶é (Full GC)çæ¶åæä¼è¢«æ§è¡ GCãJava ç¨åºä¸é叏伿大éç被å建çå符串çå¾
åæ¶ï¼å°åç¬¦ä¸²å¸¸éæ± æ¾å°å ä¸ï¼è½å¤æ´é«æåæ¶å°åæ¶å符串å
åã
ç¸å
³é®é¢ï¼[JVM 叏鿱 ä¸åå¨çæ¯å¯¹è±¡è¿æ¯å¼ç¨å¢ï¼ - RednaxelaFX - ç¥ä¹](https://www.zhihu.com/question/57109429/answer/151717241)
æå忥åäº«ä¸æ®µå¨å¿æèå¸å¨[ãæ·±å
¥çè§£ Java èææºï¼ç¬¬ 3 çï¼ãæ ·ä¾ä»£ç &å误](https://github.com/fenixsoft/jvm_book) GitHub ä»åºç [issue#112](https://github.com/fenixsoft/jvm_book/issues/112) ä¸è¯´è¿çè¯ï¼
> **è¿è¡æ¶å¸¸éæ± ãæ¹æ³åºãåç¬¦ä¸²å¸¸éæ± è¿äºé½æ¯ä¸éèææºå®ç°èæ¹åçé»è¾æ¦å¿µï¼æ¯å
Œ
±ä¸æ½è±¡çï¼MetaspaceãHeap æ¯ä¸å
·ä½æç§èææºå®ç°ç¸å
³çç©çæ¦å¿µï¼æ¯ç§æä¸å
·ä½çã**
### ç´æ¥å
å
ç´æ¥å
忝ä¸ç§ç¹æ®çå
åç¼å²åºï¼å¹¶ä¸å¨ Java å ææ¹æ³åºä¸åé
çï¼èæ¯éè¿ JNI çæ¹å¼å¨æ¬å°å
åä¸åé
çã
ç´æ¥å
å并䏿¯èææºè¿è¡æ¶æ°æ®åºçä¸é¨åï¼ä¹ä¸æ¯èææºè§èä¸å®ä¹çå
ååºåï¼ä½æ¯è¿é¨åå
åä¹è¢«é¢ç¹å°ä½¿ç¨ãèä¸ä¹å¯è½å¯¼è´ `OutOfMemoryError` é误åºç°ã
JDK1.4 䏿°å å
¥ç **NIOï¼Non-Blocking I/Oï¼ä¹è¢«ç§°ä¸º New I/Oï¼**ï¼å¼å
¥äºä¸ç§åºäº**ééï¼Channelï¼**ä¸**ç¼ååºï¼Bufferï¼**ç I/O æ¹å¼ï¼å®å¯ä»¥ç´æ¥ä½¿ç¨ Native 彿°åºç´æ¥åé
å å¤å
åï¼ç¶åéè¿ä¸ä¸ªåå¨å¨ Java å ä¸ç DirectByteBuffer 对象ä½ä¸ºè¿åå
åçå¼ç¨è¿è¡æä½ãè¿æ ·å°±è½å¨ä¸äºåºæ¯ä¸æ¾èæé«æ§è½ï¼å 为**é¿å
äºå¨ Java å å Native å ä¹é´æ¥åå¤å¶æ°æ®**ã
ç´æ¥å
åçåé
ä¸ä¼åå° Java å çéå¶ï¼ä½æ¯ï¼æ¢ç¶æ¯å
åå°±ä¼åå°æ¬æºæ»å
å大å°ä»¥åå¤çå¨å¯»å空é´çéå¶ã
ç±»ä¼¼çæ¦å¿µè¿æ **å å¤å
å** ãå¨ä¸äºæç« ä¸å°ç´æ¥å
åçä»·äºå å¤å
åï¼ä¸ªäººè§å¾ä¸æ¯ç¹å«åç¡®ã
å å¤å
åå°±æ¯æå
å对象åé
å¨å ï¼æ°ç代+è年代+æ°¸ä¹
代ï¼ä»¥å¤çå
åï¼è¿äºå
åç´æ¥åæä½ç³»ç»ç®¡çï¼è䏿¯èææºï¼ï¼è¿æ ·åçç»æå°±æ¯è½å¤å¨ä¸å®ç¨åº¦ä¸åå°åå¾åæ¶å¯¹åºç¨ç¨åºé æçå½±åã
## HotSpot èææºå¯¹è±¡æ¢ç§
éè¿ä¸é¢çä»ç»æä»¬å¤§æ¦ç¥éäºèææºçå
åæ
åµï¼ä¸é¢æä»¬æ¥è¯¦ç»çäºè§£ä¸ä¸ HotSpot èææºå¨ Java å ä¸å¯¹è±¡åé
ãå¸å±å访é®çå
¨è¿ç¨ã
### 对象çå建
Java 对象çå建è¿ç¨æå»ºè®®æå¥½æ¯è½é»ååºæ¥ï¼å¹¶ä¸è¦ææ¡æ¯ä¸æ¥å¨åä»ä¹ã
#### Step1:ç±»å è½½æ£æ¥
èææºéå°ä¸æ¡ new æä»¤æ¶ï¼é¦å
å°å»æ£æ¥è¿ä¸ªæä»¤çåæ°æ¯å¦è½å¨å¸¸éæ± ä¸å®ä½å°è¿ä¸ªç±»ç符å·å¼ç¨ï¼å¹¶ä¸æ£æ¥è¿ä¸ªç¬¦å·å¼ç¨ä»£è¡¨çç±»æ¯å¦å·²è¢«å è½½è¿ãè§£æååå§åè¿ãå¦ææ²¡æï¼é£å¿
é¡»å
æ§è¡ç¸åºçç±»å è½½è¿ç¨ã
#### Step2:åé
å
å
å¨**ç±»å è½½æ£æ¥**éè¿åï¼æ¥ä¸æ¥èææºå°ä¸ºæ°ç对象**åé
å
å**ã对象æéçå
å大å°å¨ç±»å è½½å®æå便å¯ç¡®å®ï¼ä¸ºå¯¹è±¡åé
空é´çä»»å¡çåäºæä¸åç¡®å®å¤§å°çå
åä» Java å ä¸åååºæ¥ã**åé
æ¹å¼**æ **âæé碰æâ** å **â空é²å表â** 两ç§ï¼**éæ©åªç§åé
æ¹å¼ç± Java å æ¯å¦è§æ´å³å®ï¼è Java å æ¯å¦è§æ´åç±æéç¨çå徿¶é卿¯å¦å¸¦æå缩æ´çåè½å³å®**ã
**å
ååé
çä¸¤ç§æ¹å¼** ï¼è¡¥å
å
容ï¼éè¦ææ¡ï¼ï¼
- æé碰æï¼
- éç¨åºåï¼å å
åè§æ´ï¼å³æ²¡æå
åç¢çï¼çæ
åµä¸ã
- åçï¼ç¨è¿çå
åå
¨é¨æ´åå°ä¸è¾¹ï¼æ²¡æç¨è¿çå
åæ¾å¨å¦ä¸è¾¹ï¼ä¸é´æä¸ä¸ªåçæéï¼åªéè¦åçæ²¡ç¨è¿çå
åæ¹åå°è¯¥æéç§»å¨å¯¹è±¡å
å大å°ä½ç½®å³å¯ã
- 使ç¨è¯¥åé
æ¹å¼ç GC æ¶éå¨ï¼Serial, ParNew
- 空é²å表ï¼
- éç¨åºåï¼å å
åä¸è§æ´çæ
åµä¸ã
- åçï¼èææºä¼ç»´æ¤ä¸ä¸ªå表ï¼è¯¥å表ä¸ä¼è®°å½åªäºå
å忝å¯ç¨çï¼å¨åé
çæ¶åï¼æ¾ä¸åå¿è¶³å¤å¤§çå
ååå¿æ¥ååç»å¯¹è±¡å®ä¾ï¼æåæ´æ°å表记å½ã
- 使ç¨è¯¥åé
æ¹å¼ç GC æ¶éå¨ï¼CMS
鿩以ä¸ä¸¤ç§æ¹å¼ä¸çåªä¸ç§ï¼åå³äº Java å å
忝å¦è§æ´ãè Java å å
忝å¦è§æ´ï¼åå³äº GC æ¶éå¨çç®æ³æ¯"æ è®°-æ¸
é¤"ï¼è¿æ¯"æ è®°-æ´ç"ï¼ä¹ç§°ä½"æ è®°-å缩"ï¼ï¼å¼å¾æ³¨æçæ¯ï¼å¤å¶ç®æ³å
å乿¯è§æ´çã
**å
ååé
å¹¶åé®é¢ï¼è¡¥å
å
容ï¼éè¦ææ¡ï¼**
å¨åå»ºå¯¹è±¡çæ¶åæä¸ä¸ªå¾éè¦çé®é¢ï¼å°±æ¯çº¿ç¨å®å
¨ï¼å 为å¨å®é
å¼åè¿ç¨ä¸ï¼å建对象æ¯å¾é¢ç¹çäºæ
ï¼ä½ä¸ºèææºæ¥è¯´ï¼å¿
é¡»è¦ä¿è¯çº¿ç¨æ¯å®å
¨çï¼é常æ¥è®²ï¼èææºéç¨ä¸¤ç§æ¹å¼æ¥ä¿è¯çº¿ç¨å®å
¨ï¼
- **CAS+失败éè¯ï¼** CAS æ¯ä¹è§éçä¸ç§å®ç°æ¹å¼ãæè°ä¹è§éå°±æ¯ï¼æ¯æ¬¡ä¸å éèæ¯å设没æå²çªèå»å®ææé¡¹æä½ï¼å¦æå 为å²çªå¤±è´¥å°±éè¯ï¼ç´å°æå为æ¢ã**èææºéç¨ CAS é
ä¸å¤±è´¥éè¯çæ¹å¼ä¿è¯æ´æ°æä½çååæ§ã**
- **TLABï¼** 为æ¯ä¸ä¸ªçº¿ç¨é¢å
å¨ Eden åºåé
ä¸åå¿å
åï¼JVM å¨ç»çº¿ç¨ä¸ç对象åé
å
åæ¶ï¼é¦å
å¨ TLAB åé
ï¼å½å¯¹è±¡å¤§äº TLAB ä¸çå©ä½å
åæ TLAB çå
åå·²ç¨å°½æ¶ï¼åéç¨ä¸è¿°ç CAS è¿è¡å
ååé
#### Step3:åå§åé¶å¼
å
ååé
宿åï¼èææºéè¦å°åé
å°çå
å空é´é½åå§å为é¶å¼ï¼ä¸å
æ¬å¯¹è±¡å¤´ï¼ï¼è¿ä¸æ¥æä½ä¿è¯äºå¯¹è±¡çå®ä¾åæ®µå¨ Java 代ç ä¸å¯ä»¥ä¸èµåå§å¼å°±ç´æ¥ä½¿ç¨ï¼ç¨åºè½è®¿é®å°è¿äºåæ®µçæ°æ®ç±»åæå¯¹åºçé¶å¼ã
#### Step4:设置对象头
åå§åé¶å¼å®æä¹åï¼**èææºè¦å¯¹å¯¹è±¡è¿è¡å¿
è¦ç设置**ï¼ä¾å¦è¿ä¸ªå¯¹è±¡æ¯åªä¸ªç±»çå®ä¾ãå¦ä½æè½æ¾å°ç±»çå
æ°æ®ä¿¡æ¯ã对象çåå¸ç ã对象ç GC å代年é¾çä¿¡æ¯ã **è¿äºä¿¡æ¯åæ¾å¨å¯¹è±¡å¤´ä¸ã** å¦å¤ï¼æ ¹æ®èææºå½åè¿è¡ç¶æçä¸åï¼å¦æ¯å¦å¯ç¨ååéçï¼å¯¹è±¡å¤´ä¼æä¸åç设置æ¹å¼ã
#### Step5:æ§è¡ init æ¹æ³
å¨ä¸é¢å·¥ä½é½å®æä¹åï¼ä»èææºçè§è§æ¥çï¼ä¸ä¸ªæ°ç对象已ç»äº§çäºï¼ä½ä» Java ç¨åºçè§è§æ¥çï¼å¯¹è±¡å建æåå¼å§ï¼`