1.2 ä¸åï¼30 å¼ æç»å¾ï¼å ¨é¢æ»ç» JVM æ ¸å¿ç¥è¯ç¹
ä¸ãåºæ¬æ¦å¿µ
1.1 OpenJDK
èª 1996 å¹´ JDK 1.0 åå¸ä»¥æ¥ï¼Sun å
¬å¸å¨å¤§çæ¬ä¸åè¡äº JDK 1.1ãJDK 1.2ãJDK 1.3ãJDK 1.4ãJDK 5ï¼JDK 6 ï¼è¿äºçæ¬ç JDK é½å¯ä»¥ç»ç§°ä¸º SunJDK ã
ä¹åå¨ 2006 å¹´ç JavaOne 大ä¼ä¸ï¼Sun å ¬å¸å®£å¸å° Java 弿ºï¼å¨éåçä¸å¹´å¤éï¼å®éç»å° JDK çå个é¨åå¨ GPL v2ï¼GNU General Public Licenseï¼version 2ï¼åè®®ä¸å¼æºï¼å¹¶å»ºç«äº OpenJDK ç»ç»æ¥å¯¹è¿äºä»£ç è¿è¡ç¬ç«ç管çï¼è¿å°±æ¯ OpenJDK çæ¥æºï¼æ¤æ¶ç OpenJDK æ¥æå½æ¶ sunJDK 7 çå ä¹å ¨é¨ä»£ç ã
1.2 OracleJDK
å¨ JDK 7 çå¼åæé´ï¼ç±äºåç§åå çå½±åï¼Sun å ¬å¸å¸å¼ä¸è·¯ä¸è·ï¼å·²æ åæ¨è¿ JDK 7 çå¼åï¼äºæ¯ JDK 7 çåå¸ä¸ç´è¢«æ¨è¿ã
ä¹åå¨ 2009 å¹´ Sun å ¬å¸è¢« Oracle å ¬å¸æ¶è´ï¼ä¸ºè§£å³ JDK 7 é¿æè·³ç¥¨çé®é¢ï¼Oracle å° JDK 7 ä¸å¤§é¨åæªè½å®æçé¡¹ç®æ¨è¿å° JDK 8 ï¼å¹¶äº 2011 å¹´åå¸äºJDK 7ï¼å¨è¿ä¹åç± Oracle å ¬å¸æ£å¸¸åè¡ç JDK çæ¬å°±ç± SunJDK æ¹ç§°ä¸º Oracle JDKã
å¨ 2017 å¹´ JDK 9 åå¸åï¼Oracle å ¬å¸å®£å¸ï¼ä»¥å JDK å°ä¼å¨æ¯å¹´ç 3 æå 9 æååå¸ä¸ä¸ªå¤§çæ¬ï¼å³åå¹´åè¡ä¸ä¸ªå¤§çæ¬ï¼ç®çæ¯ä¸ºäºé¿å ä¼å¤åè½è¢«æç»å°ä¸ä¸ª JDK çæ¬ä¸èå¼åçæ æ³äº¤ä»çé£é©ã
å¨ JDK 11 åå¸åï¼Oracle åæ¥è°æ´äº JDK çå䏿æï¼å®£å¸ä» JDK 11 èµ·ï¼å°ä»¥åçåä¸ç¹æ§å ¨é¨å¼æºç» OpenJDK ï¼è¿æ · OpenJDK 11 å OracleJDK 11 ç代ç ååè½ï¼å¨æ¬è´¨ä¸å°±å®å ¨ç¸åäºã
åæ¶è¿å®£å¸ä»¥åä¼åè¡ä¸¤ä¸ªçæ¬ç JDK ï¼
- ä¸ä¸ªæ¯å¨ GPLv2 + CE åè®®ä¸ç± Oracle 弿ºç OpenJDKï¼
- ä¸ä¸ªæ¯å¨ OTN åè®®ä¸æ£å¸¸åè¡ç OracleJDKã
两è å ±äº«å¤§é¨åæºç ï¼å¨åè½ä¸å ä¹ä¸è´ãå¯ä¸çåºå«æ¯ Oracle OpenJDK å¯ä»¥å¨å¼åãæµè¯æè ç产ç¯å¢ä¸ä½¿ç¨ï¼ä½åªæåå¹´çæ´æ°æ¯æï¼è OracleJDK 对个人å è´¹ï¼ä½å¨ç产ç¯å¢ä¸åç¨æ¶è´¹ï¼å¯ä»¥æä¸å¹´æ¶é´çæ´æ°æ¯æã
ç®åææ°çé¿ææ¯æç JDK æ¯ JDK 21ï¼LTSï¼ï¼è¯¦æ å¯ä»¥åèæå why ææ¯çå¸åã
1.3 HotSpot VM
宿¯ Sun/Oracle JDK å OpenJDK ä¸é»è®¤çèææºï¼ä¹æ¯ç®åä½¿ç¨æä¸ºå¹¿æ³çèææºã
æåç± Longview Technologies å ¬å¸è®¾è®¡åæï¼è¯¥å ¬å¸å¨ 1997 年被 Sun å ¬å¸æ¶è´ï¼éå Sun å ¬å¸å¨ 2006 年弿º SunJDK æ¶ä¹å° HotSpot èææºä¸å¹¶è¿è¡äºå¼æºã
Oracle æ¶è´ Sun 以åï¼å»ºç«äº HotRockit 项ç®ï¼å¹¶å°å ¶æ¶è´çå¦å¤ä¸å®¶å ¬å¸ï¼BEAï¼ç JRockit èææºä¸çä¼ç§ç¹æ§éæå° HotSpot ä¸ã
HotSpot å¨è¿ä¸ªè¿ç¨éç§»é¤ææ°¸ä¹ ä»£ï¼å¹¶å¸æ¶äº JRockit ç Java Mission Control çæ§å·¥å ·çåè½ã
å° JDK 8 åè¡æ¶ï¼éç¨çå°±æ¯é两è ä¹é¿ç HotSpot VMã
æä»¬å¯ä»¥å¨èªå·±ççµèä¸ä½¿ç¨ java -version æ¥è·å¾ JDK çä¿¡æ¯ï¼

äºãJava å ååºå
Java å ååºåæä»¬ä¹å讲è¿ï¼è¿éåçä¸çã

2.1 ç¨åºè®¡æ°å¨
ç¨åºè®¡æ°å¨ï¼Program Counter Registerï¼æ¯ä¸åè¾å°çå å空é´ï¼å®å¯ä»¥ç忝å½åçº¿ç¨ææ§è¡çåèç çè¡å·æç¤ºå¨ã
åèç è§£éå¨éè¿æ¹åç¨åºè®¡æ°å¨ç弿¥éåä¸ä¸æ¡éè¦æ§è¡çåèç æä»¤ï¼åæ¯ã循ç¯ã跳转ãå¼å¸¸å¤çãçº¿ç¨æ¢å¤çåºç¡åè½é½éè¦è¯¥è®¡æ°å¨æ¥å®æã
æ¯ä¸ªçº¿ç¨é½æ¥æä¸ä¸ªç¬ç«çç¨åºè®¡æ°å¨ï¼å个线ç¨ä¹é´ç计æ°å¨äºä¸å½±åï¼ç¬ç«åå¨ã
2.2 èææºæ
èææºæ ï¼Java Virtual Machine Stackï¼ä¹æ¯çº¿ç¨ç§æï¼å®æè¿°çæ¯ Java æ¹æ³æ§è¡ç线ç¨å 忍¡åï¼æ¯ä¸ªæ¹æ³è¢«æ§è¡çæ¶åï¼Java èææºé½ä¼åæ¥å建ä¸ä¸ªæ 帧ï¼ç¨äºåå¨å±é¨åé表ãæä½æ°æ ãå¨æè¿æ¥ãæ¹æ³åºå£çä¿¡æ¯ã
æ¹æ³ä»è°ç¨å°ç»æå°±å¯¹åºçä¸ä¸ªæ 帧ä»å ¥æ å°åºæ çè¿ç¨ãå¨ãJava èææºè§èãä¸ï¼å¯¹è¯¥å ååºåè§å®äºä¸¤ç±»å¼å¸¸ï¼
- å¦æçº¿ç¨è¯·æ±çæ æ·±åº¦å¤§äºèææºæå
è®¸çæ æ·±åº¦ï¼å°æåº
StackOverflowErrorå¼å¸¸ï¼ - 妿 Java èææºæ ç容éå
è®¸å¨ææ©å±ï¼å½æ æ©å±æ¶å¦ææ æ³ç³è¯·å°è¶³å¤çå
å伿åº
OutOfMemoryErrorå¼å¸¸ã
2.3 æ¬å°æ¹æ³æ
æ¬å°æ¹æ³æ ï¼Native Method Stacksï¼ä¸èææºæ 类似ï¼å ¶åºå«å¨äºï¼Java èææºæ æ¯ä¸ºèææºæ§è¡ Java æ¹æ³ï¼ä¹å°±æ¯åèç ï¼æå¡çï¼èæ¬å°æ¹æ³æ åæ¯ä¸º JVM 使ç¨å°çæ¬å°ï¼Nativeï¼æ¹æ³æå¡ã
2.4 å
å ï¼Java Heapï¼æ¯èææºæç®¡ççæå¤§ä¸åå å空é´ï¼å®è¢«ææçº¿ç¨æå ±äº«ï¼ç¨äºåæ¾å¯¹è±¡å®ä¾ã
Java å å¯ä»¥å¤äºç©çä¸ä¸è¿ç»çå å空é´ä¸ï¼ä½å¨é»è¾ä¸å®åºè¯¥è¢«è§ä¸ºæ¯è¿ç»çãJava å å¯ä»¥è¢«å®ç°æåºå®å¤§å°çï¼ä¹å¯ä»¥æ¯å¯æ©å±çã
å½å大夿°ä¸»æµçèææºé½æ¯æç
§å¯æ©å±æ¥å®ç°çï¼å³å¯ä»¥éè¿æå¤§å¼åæ° -Xmx åæå°å¼åæ° -Xms è¿è¡è®¾å®ã
妿 Java å 䏿²¡æè¶³å¤çå
åæ¥å®æå¯¹è±¡å®ä¾åé
ï¼å¹¶ä¸å 乿 æ³åæ©å±æ¶ï¼Java èææºå°ä¼æåº OutOfMemoryError å¼å¸¸ã
2.5 æ¹æ³åº
æ¹æ³åºï¼Method Areaï¼ä¹æ¯å个线ç¨å ±äº«çå ååºåï¼ç¨äºåå¨å·²è¢«èææºå è½½ç类信æ¯ã常éãéæåéãJIT ç¼è¯åç代ç ç¼åçæ°æ®ã
æ¹æ³åºä¹è¢«ç§°ä¸º âéå âï¼ç®çæ¯ä¸ Java å è¿è¡åºåããJava èææºè§èãè§å®ï¼å¦ææ¹æ³åºæ æ³æ»¡è¶³æ°çå
ååé
éæ±æ¶ï¼å°ä¼æåº OutOfMemoryError å¼å¸¸ã
JDK 8 以åçæ¹æ³åºå®ç°å·²ç»ä¸åæ¯æ°¸ä¹ 代ï¼Permanent Generationï¼äºï¼èæ¯ä½¿ç¨å 空é´ï¼Metaspaceï¼æ¥å®ç°ã
è¿è¡æ¶å¸¸éæ± ï¼Runtime Constant Poolï¼ä¹æ¯æ¹æ³åºçä¸é¨åï¼ç¨äºåæ¾å¸¸éæ± è¡¨ï¼Constant Pool Tableï¼ï¼å¸¸éæ± è¡¨ä¸åæ¾äºç¼è¯æçæçåç§ç¬¦å·åé¢éå符å·å¼ç¨ã
JDK 8 以åçè¿è¡æ¶å¸¸éæ± å¨å 空é´ä¸ã

ä¸ã对象
3.1 对象çå建
彿们å¨ä»£ç ä¸ä½¿ç¨ new å
³é®åå建ä¸ä¸ªå¯¹è±¡æ¶ï¼å
¶å¨ JVM ä¸éè¦ç»è¿ä»¥ä¸æ¥éª¤ï¼
1. ç±»å è½½è¿ç¨
å½èææºéå°ä¸æ¡åèç æä»¤ new æ¶ï¼é¦å
å°å»æ£æ¥è¿ä¸ªæä»¤çåæ°æ¯å¦è½å¨å¸¸éæ± ä¸å®ä½å°ä¸ä¸ªç¬¦å·å¼ç¨ï¼å¹¶ä¸æ£æ¥è¿ä¸ªç¬¦å·å¼ç¨ä»£è¡¨çç±»æ¯å¦å·²è¢«å è½½ãè§£æååå§åè¿ãå¦ææ²¡æï¼å°±å¿
é¡»å
æ§è¡ç¸åºçç±»å è½½è¿ç¨ã
2. åé å å
å¨ç±»å è½½æ£æ¥éè¿åï¼èææºéè¦ç»æ°ç对象åé å å空é´ãæ ¹æ® Java å æ¯å¦è§æ´ï¼å¯ä»¥æä»¥ä¸ä¸¤ç§åé æ¹æ¡ï¼
â ãæé碰æï¼å设 Java å ä¸å 忝ç»å¯¹è§æ´çï¼ææä½¿ç¨çå åæ¾å¨ä¸è¾¹ï¼æææªè¢«ä½¿ç¨çå åæ¾å¨å¦å¤ä¸è¾¹ï¼ä¸é´ä»¥æéä½ä¸ºåçç¹æç¤ºå¨ã
æ¤æ¶å ååé åªæ¯å°æéåç©ºé²æ¹ååç§»åºå¯¹è±¡å¤§å°ç空é´å³å¯ï¼è¿ç§æ¹å¼è¢«ç§°ä¸ºæé碰æã

â¡ã空é²å表ï¼å¦æ Java å 䏿¯è§æ´çï¼æ¤æ¶èææºéè¦ç»´æ¤ä¸ä¸ªå表ï¼è®°å½åªäºå å忝å¯ç¨çï¼åªäºæ¯ä¸å¯ç¨çãå¨è¿è¡å ååé æ¶ï¼åªéè¦ä»è¯¥å表ä¸éååºä¸åè¶³å¤çå å空é´ååç»å¯¹è±¡å®ä¾å³å¯ã
注ï¼Java å æ¯å¦è§æ´åå³äºå ¶éç¨çå徿¶é卿¯å¦å¸¦æç©ºé´å缩æ´çè½åï¼åé¢è®²è¿äºã
é¤äºåé æ¹å¼å¤ï¼ç±äºå¯¹è±¡å建å¨èææºä¸æ¯ä¸ä¸ªé常é¢ç¹çè¡ä¸ºï¼æ¤æ¶éè¦ä¿è¯å¨å¹¶åç¯å¢ä¸ç线ç¨å®å ¨ï¼å¦æä¸ä¸ªçº¿ç¨ç»å¯¹è±¡ A åé äºå å空é´ï¼ä½æéè¿æ²¡æ¥å¾åä¿®æ¹ï¼æ¤æ¶å°±å¯è½åºç°å¦å¤ä¸ä¸ªçº¿ç¨ä½¿ç¨åæ¥çæéæ¥ç»å¯¹è±¡ B åé å å空é´çæ åµã
æ³è¦è§£å³è¿ä¸ªé®é¢æä¸¤ä¸ªæ¹æ¡ï¼
â ãæ¹å¼ä¸ï¼éç¨åæ¥éå®ï¼æéç¨ CAS é ä¸å¤±è´¥éè¯çæ¹å¼æ¥ä¿è¯æ´æ°æä½çååæ§ã
â¡ãæ¹å¼äºï¼ä¸ºæ¯ä¸ªçº¿ç¨å¨ Java å ä¸é¢å åé ä¸åå åï¼ç§°ä¸ºæ¬å°çº¿ç¨åé ç¼å²ï¼Thread Local Allocation Bufferï¼TLABï¼ã
线ç¨å¨è¿è¡å ååé æ¶ä¼å ä½¿ç¨æ¬å°ç¼å²ï¼å½æ¬å°ç¼å²ä½¿ç¨å®æåï¼åå Java å ç³è¯·åé ï¼æ¤æ¶ Java å éç¨åæ¥éå®çæ¹å¼æ¥ä¿è¯åé è¡ä¸ºç线ç¨å®å ¨ã
3. 对象头设置
å°å¯¹è±¡æå ³çå æ°æ®ä¿¡æ¯ã对象çåå¸ç ãå代年é¾çä¿¡æ¯åå¨å°å¯¹è±¡å¤´ä¸ã
å¯ä»¥å JIT é£èçå å®¹å ³èèµ·æ¥ã
4. 对象åå§å
è°ç¨å¯¹è±¡çæé æ¹æ³ï¼å³ Class æä»¶ä¸ç <init>() æ¥åå§å对象ï¼ä¸ºç¸å
³å段èµå¼ã
3.2 对象çå åå¸å±
å¨ HotSpot ä¸ï¼å¯¹è±¡å¨å å åä¸çåå¨å¸å±å¯ä»¥åå为以ä¸ä¸ä¸ªé¨åï¼
1. 对象头 (Header)
å¯¹è±¡å¤´å æ¬ä¸¤é¨åä¿¡æ¯ï¼
- Mark Wordï¼å¯¹è±¡èªèº«çè¿è¡æ¶æ°æ®ï¼å¦åå¸ç ãGC å代年é¾ãéç¶ææ å¿ãçº¿ç¨ææçéãååçº¿ç¨ IDãååæ¶é´æ³çï¼å®æ¹ç»ç§°ä¸º Mark Wordï¼æä»¬æ¾å¨ synchronized çåç§éç¶æè®²è¿ã
- ç±»åæéï¼å¯¹è±¡æåå®ç±»åå æ°æ®çæéï¼Java èææºéè¿è¿ä¸ªæéæ¥ç¡®å®è¯¥å¯¹è±¡æ¯åªä¸ªç±»çå®ä¾ãéè¦è¯´æçæ¯ï¼å¹¶éææçèææºé½å¿ é¡»è¦å¨å¯¹è±¡æ°æ®ä¸ä¿çç±»åæéï¼è¿åå³äºå¯¹è±¡ç访é®å®ä½æ¹å¼ã
2. å®ä¾æ°æ® (Instance Data)
峿们å¨ä»£ç ä¸å®ä¹çåç§ç±»åçåæ®µï¼æ 论æ¯ä»ç¶ç±»ç»§æ¿èæ¥ï¼è¿æ¯åç±»ä¸å®ä¹çé½éè¦è®°å½ã
3. 对é½å¡«å (Padding)
主è¦èµ·å ä½ç¬¦çä½ç¨ãHotSpot è¦æ±å¯¹è±¡èµ·å§å°åå¿ é¡»æ¯ 8 åèçæ´åæ°ï¼å³é´æ¥è¦æ±äºä»»ä½å¯¹è±¡ç大å°é½å¿ é¡»æ¯ 8 åèçæ´åæ°ã对象头é¨åå¨è®¾è®¡ä¸å°±æ¯ 8 åèçæ´åæ°ï¼å¦æå¯¹è±¡çå®ä¾æ°æ®ä¸æ¯ 8 åèçæ´åæ°ï¼åç±å¯¹é½å¡«å è¿è¡è¡¥å ¨ã
3.3 对象ç访é®å®ä½
对象å建åï¼Java ç¨åºå°±å¯ä»¥éè¿æ ä¸ç referenceï¼ä¹å°±æ¯å¼ç¨ï¼æ¥æä½å ä¸çå
·ä½å¯¹è±¡ã
ãJava èææºè§èãè§å® reference æ¯ä¸ä¸ªæå对象çå¼ç¨ï¼ä½å¹¶æªè§å®å
¶å
·ä½å®ç°æ¹å¼ã主æµçæ¹å¼æ¹å¼æä»¥ä¸ä¸¤ç§ï¼
- å¥æè®¿é®ï¼Java å å°åååºä¸åå
忥ä½ä¸ºå¥ææ± ï¼
referenceä¸åå¨çæ¯å¯¹è±¡ç奿å°åï¼è奿åå å«äºå¯¹è±¡å®ä¾æ°æ®åç±»åæ°æ®çå°åä¿¡æ¯ã - æé访é®ï¼
referenceä¸åå¨çç´æ¥å°±æ¯å¯¹è±¡å°åï¼è对象çç±»åæ°æ®åç±ä¸æä»ç»ç对象头ä¸çç±»åæéæ¥æå®ã
éè¿å¥æè®¿é®å¯¹è±¡ï¼

éè¿ç´æ¥æé访é®å¯¹è±¡ï¼

å¥æè®¿é®çä¼ç¹å¨äºå¯¹è±¡ç§»å¨æ¶ï¼å徿¶éæ¶ç§»å¨å¯¹è±¡æ¯é常æ®éçè¡ä¸ºï¼åªéè¦æ¹å奿ä¸å®ä¾æ°æ®çæéï¼è reference æ¬èº«å¹¶ä¸éè¦ä¿®æ¹ï¼
æé访é®ååä¹ï¼ç±äºå
¶ reference ä¸åå¨çç´æ¥å°±æ¯å¯¹è±¡å°åï¼æä»¥å½å¯¹è±¡ç§»å¨æ¶ï¼ reference éè¦è¢«ä¿®æ¹ãä½é对åªéè¦è®¿é®å¯¹è±¡æ¬èº«çåºæ¯ï¼æé访é®åå¯ä»¥åå°ä¸æ¬¡å®ä½å¼éãç±äºå¯¹è±¡è®¿é®æ¯ä¸é¡¹é常é¢ç¹çæä½ï¼æä»¥è¿ç±»åå°çææä¼é常æ¾èï¼åºäºè¿ä¸ªåå ï¼HotSpot 主è¦ä½¿ç¨çæ¯æé访é®çæ¹å¼ã
åãå徿¶éæºå¶
å¨ JVM å 忍¡åä¸ï¼ç¨åºè®¡æ°å¨ãèææºæ ãæ¬å°æ¹æ³æ è¿ 3 个åºå齿¯çº¿ç¨ç§æçï¼ä¼éç线ç¨çç»æè鿝ï¼å æ¤å¨è¿ 3 个åºåå½ä¸ï¼æ éè¿å¤èèåå¾åæ¶é®é¢ãåå¾åæ¶é®é¢ä¸»è¦åçå¨ Java å ä¸ã
å¨ Java å ä¸ï¼åå¾åæ¶ç主è¦å å®¹æ¯æ»äº¡ç对象ï¼ä¸å¯è½å被任ä½éå¾ä½¿ç¨ç对象ï¼ã
å¤æå¯¹è±¡æ¯å¦æ»äº¡æä»¥ä¸ä¸¤ç§æ¹æ³ï¼
1. å¼ç¨è®¡æ°æ³
å¨å¯¹è±¡ä¸æ·»å ä¸ä¸ªå¼ç¨è®¡æ°å¨ï¼å¯¹è±¡æ¯æ¬¡è¢«å¼ç¨æ¶ï¼è¯¥è®¡æ°å¨å ä¸ï¼å½å¼ç¨å¤±ææ¶ï¼è®¡æ°å¨çå¼åä¸ï¼åªè¦è®¡æ°å¨çå¼ä¸ºé¶ï¼å代表对åºç对象ä¸å¯è½å被使ç¨ãè¯¥æ¹æ³ç缺ç¹å¨äºæ æ³é¿å ç¸äºå¼ç¨çé®é¢ï¼
objA.instance = objB
objB.instance = objA
objA = null;
objB = null;
System.gc();å¦ä¸æç¤ºï¼æ¤æ¶ä¸¤ä¸ªå¯¹è±¡å·²ç»ä¸è½å被访é®ï¼ä½å ¶äºç¸ææå¯¹å¯¹æ¹çå¼ç¨ï¼å¦æéç¨å¼ç¨è®¡æ°æ³ï¼åä¸¤ä¸ªå¯¹è±¡é½æ æ³è¢«åæ¶ã
2. å¯è¾¾æ§åæ
ä½ä¸é¢ç代ç å¨å¤§å¤æ°èææºä¸é½è½è¢«æ£ç¡®çåæ¶ï¼å ä¸ºå¤§å¤æ°ä¸»æµçèææºé½æ¯éç¨çå¯è¾¾æ§åææ¹æ³æ¥å¤æå¯¹è±¡æ¯å¦æ»äº¡ã
å¯è¾¾æ§åææ¯éè¿ä¸ç³»å被称为 GC Roots çæ ¹å¯¹è±¡ä½ä¸ºèµ·å§èç¹éï¼ä»è¿äºèç¹å¼å§ï¼æ ¹æ®å¼ç¨å
³ç³»åä¸æç´¢ï¼æç´¢è¿ç¨æèµ°è¿çè·¯å¾è¢«ç§°ä¸ºå¼ç¨é¾ï¼Reference Chainï¼ï¼å¦ææä¸ªå¯¹è±¡å° GC Roots é´æ²¡æä»»ä½å¼ç¨é¾ç¸è¿ï¼è¿ä»£è¡¨ GC Roots å°è¯¥å¯¹è±¡ä¸å¯è¾¾ï¼ æ¤æ¶è¯æè¯¥å¯¹è±¡ä¸å¯è½å被使ç¨ã

å¨ Java è¯è¨ä¸ï¼åºå®å¯ä½ä¸º GC Roots ç对象å
æ¬ä»¥ä¸å ç§ï¼
- å¨èææºæ ï¼æ 帧ä¸çæ¬å°åé表ï¼ä¸å¼ç¨ç对象ï¼è¬å¦å个线ç¨è¢«è°ç¨çæ¹æ³å æ ä¸ä½¿ç¨å°çåæ°ãå±é¨åéã临æ¶åéçï¼
- 卿¹æ³åºï¼å 空é´ï¼ä¸ç±»éæåéå¼ç¨ç对象ï¼è¬å¦ Java ç±»ä¸å¼ç¨ç±»åçéæåéï¼
- 卿¹æ³åºï¼å 空é´ï¼ä¸å¸¸éå¼ç¨ç对象ï¼è¬å¦åç¬¦ä¸²å¸¸éæ± ï¼String Tableï¼éçå¼ç¨ï¼
- 卿¬å°æ¹æ³æ ä¸ç JNIï¼Native æ¹æ³ï¼å¼ç¨ç对象ï¼
- Java èææºå é¨çå¼ç¨ï¼å¦åºæ¬æ°æ®ç±»å对åºç Class 对象ï¼ä¸äºå¸¸é©»çå¼å¸¸å¯¹è±¡ï¼å¦ NullPointExceptionï¼OutOfMemoryError çï¼åç³»ç»ç±»å è½½å¨ï¼
- ææè¢«åæ¥éï¼synchronized å ³é®åï¼ææç对象ï¼
é¤äºè¿äºåºå®ç GC Roots éå以å¤ï¼æ ¹æ®ç¨æ·æéç¨çå徿¶éå¨ä»¥åå½ååæ¶çå
ååºåçä¸åï¼è¿å¯è½ä¼æå
¶ä»å¯¹è±¡ âä¸´æ¶æ§â å°å å
¥ï¼å
±åææå®æ´ç GC Roots éåã
3. 对象å¼ç¨
å¯è¾¾æ§åææ¯åºäºå¼ç¨é¾è¿è¡å¤æçï¼å¨ JDK 1.2 ä¹åï¼Java å°å¼ç¨å ³ç³»å为以ä¸åç±»ï¼
强å¼ç¨ (Strongly Reference)
æä¼ ç»çå¼ç¨ï¼å¦ Object obj = new Object() ãæ è®ºä»»ä½æ
åµä¸ï¼åªè¦å¼ºå¼ç¨å
³ç³»è¿åå¨ï¼å徿¶éå¨å°±æ°¸è¿ä¸ä¼åæ¶æè¢«å¼ç¨ç对象ã
软å¼ç¨ (Soft Reference)
ç¨äºæè¿°ä¸äºè¿æç¨ï¼ä½éå¿ é¡»ç对象ãåªè¢«è½¯å¼ç¨å ³èçç对象ï¼å¨ç³»ç»å°è¦åçå åæº¢åºä¹åï¼ä¼è¢«åå ¥åæ¶èå´å è¿è¡ç¬¬äºæ¬¡åæ¶ï¼å¦æè¿æ¬¡åæ¶åè¿æ²¡æè¶³å¤çå åï¼æä¼æåºå åæº¢åºå¼å¸¸ã
ä¸é¢æ¯ä¸ä¸ªä½¿ç¨ Java ä¸ SoftReference ç±»ç示ä¾ä»£ç ï¼
class SoftReferenceExample {
public static void main(String[] args) {
// å建ä¸ä¸ªå¼ºå¼ç¨ç对象
String strongReference = new String("äºå¥ï¼ææ¯ä¸ªå¼ºå¼ç¨");
// å建ä¸ä¸ªè½¯å¼ç¨ï¼æåä¸é¢ç对象
SoftReference<String> softReference = new SoftReference<>(strongReference);
// å¹²æå¼ºå¼ç¨
strongReference = null;
// ç°å¨åªæè½¯å¼ç¨æå "äºå¥ï¼ææ¯ä¸ªå¼ºå¼ç¨" 对象
// å°è¯éè¿è½¯å¼ç¨è·å对象
String retrievedString = softReference.get();
System.out.println(retrievedString); // è¾åº "äºå¥ï¼ææ¯ä¸ªå¼ºå¼ç¨"
// 强å¶è¿è¡åå¾åæ¶ï¼å¯è½ä¼æ¸
é¤è½¯å¼ç¨ç对象
System.gc();
// 忬¡å°è¯éè¿è½¯å¼ç¨è·å对象
retrievedString = softReference.get();
if (retrievedString != null) {
System.out.println(retrievedString);
} else {
System.out.println("软å¼ç¨ç对象已被åå¾åæ¶");
}
}
}è¿ä¸ªä¾åä¸ï¼æä»¬é¦å å建äºä¸ä¸ªå符串对象ç强å¼ç¨ï¼ç¶åéè¿ SoftReference å建äºè¿ä¸ªå¯¹è±¡ç软å¼ç¨ãå¨åæ¶äºå¼ºå¼ç¨åï¼è¿ä¸ªå¯¹è±¡åªå©ä¸è½¯å¼ç¨ã彿们å°è¯éè¿è½¯å¼ç¨è·å对象æ¶ï¼å¦æå¯¹è±¡è¿åå¨ï¼è½¯å¼ç¨ä¼è¿åå®ï¼å¦æå¯¹è±¡å·²è¢«å徿¶éå¨åæ¶ï¼åè¿å nullã
éè¦æ³¨æçæ¯ï¼ç¬¬äºæ¬¡åæ¶æ¶ï¼å¦æè¿æ¬¡åæ¶åè¿æ²¡æè¶³å¤çå åï¼æä¼æåºå åæº¢åºå¼å¸¸ãè¿éç âè¶³å¤â æ¯æå¨æåºå åæº¢åºå¼å¸¸ä¹åï¼ç³»ç»ä¼è¿è¡æå䏿¬¡å°è¯ï¼å¦æè¿æ¬¡åæ¶åè¿æ¯æ²¡æè¶³å¤çå åï¼æä¼æåºå åæº¢åºå¼å¸¸ã
é常æ åµä¸ï¼ä¸é¢ä»£ç 卿§è¡ gc å软å¼ç¨ä¸ä¼è¢«åæ¶ï¼å ä¸ºæ¤æ¶å åè¿æ¯è¶³å¤çã
äºå¥ï¼ææ¯ä¸ªå¼ºå¼ç¨
äºå¥ï¼ææ¯ä¸ªå¼ºå¼ç¨å¼±å¼ç¨ (Weak Reference)
ç¨äºæè¿°é£äºéå¿ é¡»ç对象ï¼å¼ºåº¦æ¯è½¯å¼ç¨å¼±ã被弱å¼ç¨å ³èç对象åªè½çåå°ä¸ä¸æ¬¡å徿¶éåçæ¶ï¼æ 论å½åå 忝å¦è¶³å¤ï¼å¼±å¼ç¨å¯¹è±¡é½ä¼è¢«åæ¶ã
æ¥çè¿æ®µä»£ç ï¼
class WeakReferenceExample {
public static void main(String[] args) {
// å建ä¸ä¸ªå¼ºå¼ç¨ç对象
String strongReference = new String("äºå¥ï¼ææ¯å¼ºå¼ç¨");
// å建ä¸ä¸ªå¼±å¼ç¨ï¼æåä¸é¢ç对象
WeakReference<String> weakReference = new WeakReference<>(strongReference);
// åæ¶å¼ºå¼ç¨
strongReference = null;
// 强å¶è¿è¡åå¾åæ¶
System.gc();
// å°è¯éè¿å¼±å¼ç¨è·å对象
String retrievedString = weakReference.get();
if (retrievedString != null) {
System.out.println(retrievedString);
} else {
System.out.println("å¼±å¼ç¨ç对象已被åå¾åæ¶");
}
}
}è¿ä¸ªä¾åä¸ï¼æä»¬é¦å å建äºä¸ä¸ªå符串对象ç强å¼ç¨ï¼ç¶åéè¿ WeakReference å建äºè¿ä¸ªå¯¹è±¡çå¼±å¼ç¨ãå¨åæ¶äºå¼ºå¼ç¨åï¼è¿ä¸ªå¯¹è±¡åªå©ä¸å¼±å¼ç¨ã彿们å°è¯éè¿å¼±å¼ç¨è·å对象æ¶ï¼å¦æå¯¹è±¡è¿åå¨ï¼å¼±å¼ç¨ä¼è¿åå®ï¼å¦æå¯¹è±¡å·²è¢«å徿¶éå¨åæ¶ï¼åè¿å nullã
è¿è¡ç»æå°±å软å¼ç¨ä¸ä¸æ ·äºï¼gc åå¼±å¼ç¨è¢«åæ¶äºã
å¼±å¼ç¨ç对象已被åå¾åæ¶èå¼ç¨ (Phantom Reference)
æå¼±çå¼ç¨å ³ç³»ã为ä¸ä¸ªå¯¹è±¡è®¾ç½®èå¼ç¨å ³èçå¯ä¸ç®çåªæ¯ä¸ºäºè½å¨è¿ä¸ªå¯¹è±¡è¢«åæ¶æ¶æ¶å°ä¸ä¸ªç³»ç»éç¥ã
èå¼ç¨å¿ é¡»åå¼ç¨éåï¼ReferenceQueueï¼èå使ç¨ãå½å徿¶éå¨åå¤åæ¶ä¸ä¸ªå¯¹è±¡æ¶ï¼å¦æåç°å®è¿æèå¼ç¨ï¼å°±ä¼å¨åæ¶å¯¹è±¡åï¼å°è¿ä¸ªèå¼ç¨å å ¥å°ä¸ä¹å ³èçå¼ç¨éåä¸ã
æ¥çè¿ä¸ªç¤ºä¾ä»£ç ï¼
class PhantomReferenceExample {
public static void main(String[] args) {
// å建ä¸ä¸ªå¼ºå¼ç¨ç对象
String strongReference = new String("äºå¥ï¼ææ¯å¼ºå¼ç¨");
// å建ä¸ä¸ªå¼ç¨éå
ReferenceQueue<String> referenceQueue = new ReferenceQueue<>();
// å建ä¸ä¸ªèå¼ç¨ï¼æåä¸é¢ç对象ï¼å¹¶ä¸å¼ç¨éåå
³è
PhantomReference<String> phantomReference = new PhantomReference<>(strongReference, referenceQueue);
// åæ¶å¼ºå¼ç¨
strongReference = null;
// 强å¶è¿è¡åå¾åæ¶
System.gc();
// æ£æ¥å¼ç¨éåï¼çæ¯å¦æéç¥
if (referenceQueue.poll() != null) {
System.out.println("èå¼ç¨ç对象已被åå¾åæ¶ï¼ä¸æ¶å°äºéç¥");
} else {
System.out.println("èå¼ç¨ç对象æªè¢«åå¾åæ¶ï¼ææªæ¶å°éç¥");
}
}
}è¿ä¸ªä¾åä¸ï¼æä»¬é¦å å建äºä¸ä¸ªå符串对象ç强å¼ç¨ï¼ç¶åéè¿ PhantomReference å建äºè¿ä¸ªå¯¹è±¡çèå¼ç¨ï¼å¹¶ä¸å¼ç¨éåå ³èãå¨åæ¶äºå¼ºå¼ç¨åï¼è¿ä¸ªå¯¹è±¡åªå©ä¸èå¼ç¨ãå½æä»¬å¼ºå¶è¿è¡åå¾åæ¶æ¶ï¼å¦æå¯¹è±¡è¿åå¨ï¼èå¼ç¨ä¸ä¼è¿åå®ï¼å¦æå¯¹è±¡å·²è¢«å徿¶éå¨åæ¶ï¼åè¿å nullãåæ¶ï¼å¦æå¯¹è±¡è¢«åæ¶ï¼èå¼ç¨ä¼è¢«å å ¥å°å¼ç¨éåä¸ã
è¿è¡ç»æå¦ä¸ï¼
èå¼ç¨ç对象已被åå¾åæ¶ï¼ä¸æ¶å°äºéç¥4. å¯¹è±¡çæ£æ»äº¡
è¦çæ£å®£åä¸ä¸ªå¯¹è±¡æ»äº¡ï¼éè¦ç»è¿è³å°ä¸¤æ¬¡æ è®°è¿ç¨ï¼
â ãå¦æå¯¹è±¡å¨è¿è¡å¯è¾¾æ§åæååç° GC Roots ä¸å¯è¾¾ï¼å°ä¼è¿è¡ç¬¬ä¸æ¬¡æ è®°ï¼
â¡ãéåè¿è¡ä¸æ¬¡çéï¼çéçæ¡ä»¶æ¯æ¤å¯¹è±¡æ¯å¦æå¿
è¦æ§è¡ finalized() æ¹æ³ã
å¦æå¯¹è±¡æ²¡æè¦ç finalized() æ¹æ³ï¼æè
finalized() å·²ç»è¢«èææºè°ç¨è¿ï¼è¿ä¸¤ç§æ
åµé½ä¼è§ä¸ºæ²¡æå¿
è¦æ§è¡ã
妿å¤å®ç»ææ¯æå¿
è¦æ§è¡ï¼æ¤æ¶å¯¹è±¡ä¼è¢«æ¾å
¥å为 F-Queue çéåï¼çå¾
Finalizer çº¿ç¨æ§è¡å
¶ finalized() æ¹æ³ã
å¨è¿ä¸ªè¿ç¨ä¸ï¼æ¶éå¨ä¼è¿è¡ç¬¬äºæ¬¡å°è§æ¨¡çæ è®°ï¼å¦æå¯¹è±¡å¨ finalized() æ¹æ³ä¸éæ°å°èªå·±ä¸å¼ç¨é¾ä¸çä»»ä½ä¸ä¸ªå¯¹è±¡è¿è¡äºå
³èï¼å¦å°èªå·±ï¼this å
³é®åï¼èµå¼ç»æä¸ªç±»åéæè
对象çæååéï¼æ¤æ¶å®å°±å®ç°äºèªææ¯æï¼åç¬¬äºæ¬¡æ è®°ä¼å°å
¶ç§»é¤ âå³å°åæ¶â çéåï¼å¦å该对象就å°è¢«çæ£åæ¶ï¼èµ°åæ»äº¡ã
4.3 å徿¶éç®æ³
1. å代æ¶éç论
å½å大夿°èææºé½éµå¾ª âå代æ¶éâ çç论è¿è¡è®¾è®¡ï¼å®å»ºç«å¨å¼ºå¼±ä¸¤ä¸ªå代å说ä¸ï¼
- å¼±å代å说 (Weak Generational Hypothesis) ï¼ç»å¤§å¤æ°å¯¹è±¡é½æ¯æçå¤ççã
- 强å代å说 (Strong Generational Hypothesis) ï¼ç¬è¿è¶å¤æ¬¡å徿¶éè¿ç¨ç对象就è¶é¾ä»¥æ¶äº¡ã
- 跨带å¼ç¨å说 (Intergenerational Reference Hypothesis) ï¼åºäºä¸é¢ä¸¤æ¡å说è¿å¯ä»¥å¾åºç䏿¡é嫿¨è®ºï¼åå¨ç¸äºå¼ç¨å ³ç³»ç两个对象ï¼åºè¯¥å¾åäºåæ¶çåæè åæ¶æ¶äº¡ã
强弱å代åè¯´å¥ å®äºå徿¶éå¨ç设计ååï¼æ¶éå¨åºè¯¥å° Java å åååºä¸åçåºåï¼ç¶åå°åæ¶å¯¹è±¡ä¾æ®å ¶å¹´é¾ï¼å¹´é¾å°±æ¯å¯¹è±¡ç»åå徿¶éçæ¬¡æ°ï¼åé å°ä¸åçåºåä¸è¿è¡åå¨ã
ä¹å妿ä¸ä¸ªåºåä¸çå¯¹è±¡é½æ¯æçå¤ççï¼é£ä¹æ¶éå¨åªéè¦å ³æ³¨å°é对象çåæ´»è䏿¯å»æ è®°é£äºå¤§éå°è¦è¢«åæ¶çå¯¹è±¡ï¼æ¤æ¶å°±è½ä»¥è¾å°ç代价è·åè¾å¤§ç空é´ã
æååå°é¾ä»¥æ¶äº¡ç对象éä¸å°ä¸åï¼æ ¹æ®å¼ºå代å说ï¼å®ä»¬æ¯å¾é¾æ¶äº¡çï¼å æ¤èææºå¯ä»¥ä½¿ç¨è¾ä½çé¢çè¿è¡åæ¶ï¼è¿å°±å ¼é¡¾äºæ¶é´åå å空é´çå¼éã
2. åæ¶ç±»å
æ ¹æ®å代æ¶éçè®ºï¼æ¶éèå´å¯ä»¥å为以ä¸å ç§ç±»åï¼
â ãé¨åæ¶é (Partial GC) ï¼å ·ä½å为ï¼
- æ°ç代æ¶éï¼Minor GC / Young GCï¼ï¼åªå¯¹æ°ç代è¿è¡å徿¶éï¼
- è年代æ¶éï¼Major GC / Old GCï¼ï¼åªå¯¹è年代è¿è¡å徿¶éãéè¦æ³¨æçæ¯ Major GC 卿çè¯å¢ä¸ä¹ç¨äºæä»£æ´å æ¶éï¼
- æ··åæ¶éï¼Mixed GCï¼ï¼å¯¹æ´ä¸ªæ°ç代åé¨åè年代è¿è¡å徿¶éã
- æ´å æ¶é (Full GC) ï¼æ¶éæ´ä¸ª Java å åæ¹æ³åºã
3. æ è®°-æ¸ é¤ç®æ³
宿¯æåºç¡çå徿¶éç®æ³ï¼æ¶éè¿ç¨åä¸ºä¸¤ä¸ªé¶æ®µï¼é¦å æ è®°åºææéè¦åæ¶ç对象ï¼å¨æ è®°å®æåï¼ç»ä¸åæ¶æææè¢«æ è®°ç对象ï¼ä¹å¯ä»¥åè¿æ¥ï¼æ è®°åæ´»å¯¹è±¡ï¼ç»ä¸åæ¶æææªè¢«æ è®°ç对象ã

å®ä¸»è¦æä»¥ä¸ä¸¤ä¸ªç¼ºç¹ï¼
- æ§è¡æçä¸ç¨³å®ï¼å¦æ Java å ä¸å å«å¤§ééè¦åæ¶ç对象ï¼åéè¦è¿è¡å¤§éæ è®°åæ¸ é¤å¨ä½ï¼
- å å空é´ç¢çåï¼æ è®°æ¸ é¤åä¼äº§ç大éä¸è¿ç»ç空é´ï¼ä»èå¯¼è´æ æ³ä¸ºå¤§å¯¹è±¡åé è¶³å¤çè¿ç»å åã
4. æ è®°-å¤å¶ç®æ³
æ è®°-å¤å¶ç®æ³åºäº âååºå¤å¶â ç®æ³ï¼å®å°å¯ç¨å åæå®¹éåå为大å°ç¸çç两åï¼æ¯æ¬¡åªä½¿ç¨å ¶ä¸ä¸åï¼å½è¿ä¸åçå å使ç¨å®äºï¼å°±å°è¿åæ´»çç对象å¤å¶å°å¦å¤ä¸åï¼ç¶ååæå·²ç»ä½¿ç¨è¿çé£åå å空é´ä¸æ¬¡æ§æ¸ çæãå ¶ä¼ç¹å¨äºé¿å äºå å空é´ç¢çåçé®é¢ï¼å ¶ç¼ºç¹å¦ä¸ï¼
- 妿å åä¸å¤æ°å¯¹è±¡é½æ¯åæ´»çï¼è¿ç§ç®æ³å°äº§ç大éçå¤å¶å¼éï¼
- 浪费å å空é´ï¼å å空é´å为äºåæçä¸åã

åºäºæ°ç代 âæçå¤çâ çç¹ç¹ï¼å¤§å¤æ°èææºé½ä¸ä¼æç
§ 1:1 çæ¯ä¾æ¥è¿è¡å
åååï¼ä¾å¦ HotSpot ä¼å°å
å空é´åå为ä¸åè¾å¤§ç Eden å两åè¾å°ç Survivor 空é´ï¼å®ä»¬ä¹é´çæ¯ä¾æ¯ 8:1:1 ã
æ¯æ¬¡åé
æ¶åªä¼ä½¿ç¨ Eden åå
¶ä¸çä¸å Survivor ï¼åçåå¾åæ¶æ¶ï¼åªéè¦å°åæ´»çå¯¹è±¡ä¸æ¬¡æ§å¤å¶å°å¦å¤ä¸å Survivor ä¸ï¼è¿æ ·åªæ 10% çå
å空é´ä¼è¢«æµªè´¹æã
å½ Survivor 空é´ä¸è¶³ä»¥å®¹çº³ä¸æ¬¡ Minor GC æ¶ï¼æ¤æ¶ç±å
¶ä»å
ååºåï¼é常æ¯èå¹´ä»£ï¼æ¥è¿è¡åé
æ
ä¿ã
5. æ è®°-æ´çç®æ³
æ è®°-æ´çç®æ³æ¯å¨æ è®°å®æåï¼è®©ææå活对象é½åå åçä¸ç«¯ç§»å¨ï¼ç¶åç´æ¥æ¸ çæè¾¹ç以å¤çå åã
å ¶ä¼ç¹å¨äºå¯ä»¥é¿å å å空é´ç¢çåçé®é¢ï¼ä¹å¯ä»¥å åå©ç¨å å空é´ï¼å ¶ç¼ºç¹å¨äºæ ¹æ®æä½¿ç¨çæ¶éå¨çä¸åï¼å¨ç§»å¨å活对象æ¶å¯è½è¦å ¨ç¨æåç¨æ·ç¨åºï¼

äºãå徿¶éå¨
å¹¶è¡ä¸å¹¶åæ¯å¹¶åç¼ç¨ä¸ç䏿åè¯ï¼å¨è°è®ºå徿¶éå¨çä¸ä¸æè¯å¢ä¸ï¼å®ä»¬çå«ä¹å¦ä¸ï¼
â ãå¹¶è¡ (Parallel) ï¼å¹¶è¡æè¿°çæ¯å¤æ¡å徿¶éå¨çº¿ç¨ä¹é´çå ³ç³»ï¼è¯´æå䏿¶é´æå¤æ¡è¿æ ·ç线ç¨å¨ååå·¥ä½ï¼æ¤æ¶é常é»è®¤ç¨æ·çº¿ç¨æ¯å¤äºçå¾ ç¶æã
â¡ãå¹¶å (Concurrent) ï¼å¹¶åæè¿°çæ¯å徿¶éå¨çº¿ç¨ä¸ç¨æ·çº¿ç¨ä¹é´çå ³ç³»ï¼è¯´æå䏿¶é´å徿¶éå¨çº¿ç¨ä¸ç¨æ·çº¿ç¨é½å¨è¿è¡ãä½ç±äºå徿¶éå¨çº¿ç¨ä¼å ç¨ä¸é¨åç³»ç»èµæºï¼æä»¥ç¨åºçååéä¾ç¶ä¼åå°ä¸å®å½±åã
HotSpot ä¸ä¸å ±åå¨ä¸æ¬¾ç»å ¸çå徿¶éå¨ï¼

æ³¨ï¼æ¶éå¨ä¹é´åå¨è¿çº¿ï¼ä»£è¡¨å®ä»¬å¯ä»¥æé 使ç¨ã
5.1 Serial æ¶éå¨
Serial æ¶é卿¯æåºç¡ãå岿æ ä¹ çæ¶éå¨ï¼å®æ¯ä¸ä¸ªåçº¿ç¨æ¶éå¨ï¼å¨è¿è¡åå¾åæ¶æ¶ï¼å¿ é¡»æåå ¶ä»ææçå·¥ä½çº¿ç¨ï¼ç´å°æ¶éç»æï¼è¿æ¯å ¶ä¸»è¦ç¼ºç¹ã
å®çä¼ç¹å¨äºå线ç¨é¿å äºå¤çº¿ç¨å¤æçä¸ä¸æåæ¢ï¼å æ¤å¨å线ç¨ç¯å¢ä¸æ¶éæçé常é«ï¼ç±äºè¿ä¸ªä¼ç¹ï¼è¿ä»ä¸ºæ¢ï¼å ¶ä»ç¶æ¯ HotSpot èææºå¨å®¢æ·ç«¯æ¨¡å¼ä¸é»è®¤çæ°ç代æ¶éå¨ï¼

5.2 ParNew æ¶éå¨
宿¯ Serial æ¶éå¨çå¤çº¿ç¨çæ¬ï¼å¯ä»¥ä½¿ç¨å¤æ¡çº¿ç¨è¿è¡åå¾åæ¶ï¼

5.3 Parallel Scavenge æ¶éå¨
Parallel Scavenge 乿¯æ°ç代æ¶éå¨ï¼åºäº æ è®°-å¤å¶ ç®æ³è¿è¡å®ç°ï¼å®çç®æ æ¯è¾¾å°ä¸ä¸ªå¯æ§çååéãè¿éçååéæçæ¯å¤çå¨è¿è¡ç¨æ·ä»£ç çæ¶é´ä¸å¤ç卿»æ¶èæ¶é´çæ¯å¼ï¼
ååé = è¿è¡ç¨æ·ä»£ç æ¶é´ \ (è¿è¡ç¨æ·ä»£ç æ¶é´ + è¿è¡å徿¶éæ¶é´)Parallel Scavenge æ¶é卿ä¾ä¸¤ä¸ªåæ°ç¨äºç²¾ç¡®æ§å¶ååéï¼
â ã-XX:MaxGCPauseMillisï¼æ§å¶æå¤§å徿¶éæ¶é´ï¼å设éè¦åæ¶çå徿»éä¸åï¼é£ä¹éä½å徿¶éçæ¶é´å°±ä¼å¯¼è´æ¶éé¢çåé«ï¼æä»¥éè¦å°å
¶è®¾ç½®ä¸ºåéçå¼ï¼ä¸è½ä¸å³åå°ã
â¡ã-XX:MaxGCTimeRatioï¼ç´æ¥ç¨äºè®¾ç½®ååé大å°ï¼å®æ¯ä¸ä¸ªå¤§äº 0 å°äº 100 çæ´æ°ãå设æå®è®¾ç½®ä¸º 19ï¼è¡¨ç¤ºæ¤æ¶å
许çæå¤§å徿¶éæ¶é´å æ»æ¶é´ç 5%ï¼å³ 1/(1+19) ï¼ï¼é»è®¤å¼ä¸º 99 ï¼å³å
许æå¤§ 1%ï¼ 1/(1+99) ï¼çå徿¶éæ¶é´ã
5.4 Serial Old æ¶éå¨
ä»ååä¹è½çåºæ¥ï¼å®æ¯ Serial æ¶éå¨çèå¹´ä»£çæ¬ï¼åæ ·æ¯ä¸ä¸ªåçº¿ç¨æ¶éå¨ï¼éç¨ æ è®°-æ´ç ç®æ³ï¼ä¸»è¦ç¨äºç»å®¢æ·ç«¯æ¨¡å¼ä¸ç HotSpot 使ç¨ï¼

5.5 Paralled Old æ¶éå¨
Paralled Old æ¯ Parallel Scavenge æ¶éå¨çèå¹´ä»£çæ¬ï¼æ¯æå¤çº¿ç¨å¹¶åæ¶éï¼éç¨ æ è®°-æ´ç ç®æ³å®ç°ï¼

5.6 CMS æ¶éå¨
CMSï¼Concurrent Mark Sweepï¼æ¶é卿¯ä¸ç§ä»¥è·åæçåæ¶åé¡¿æ¶é´ä¸ºç®æ çæ¶éå¨ï¼åºäº æ è®°-æ¸ é¤ ç®æ³å®ç°ï¼æ´ä¸ªæ¶éè¿ç¨å为以ä¸åä¸ªé¶æ®µï¼
- åå§æ è®° (inital mark) ï¼æ è®°
GC Rootsè½ç´æ¥å ³èå°ç对象ï¼èæ¶çä½éè¦æåç¨æ·çº¿ç¨ï¼ - å¹¶åæ è®° (concurrent mark) ï¼ä»
GC Rootsè½ç´æ¥å ³èå°ç对象å¼å§éåæ´ä¸ªå¯¹è±¡å¾ï¼èæ¶é¿ä½ä¸éè¦æåç¨æ·çº¿ç¨ï¼ - éæ°æ è®° (remark) ï¼éç¨å¢éæ´æ°ç®æ³ï¼å¯¹å¹¶åæ è®°é¶æ®µå ä¸ºç¨æ·çº¿ç¨è¿è¡è产çåå¨çé£é¨å对象è¿è¡éæ°æ è®°ï¼èæ¶æ¯åå§æ è®°ç¨é¿ä¸éè¦æåç¨æ·çº¿ç¨ï¼
- 并忏 é¤ (inital sweep) ï¼å¹¶åæ¸ é¤æå·²ç»æ»äº¡ç对象ï¼èæ¶é¿ä½ä¸éè¦æåç¨æ·çº¿ç¨ã

å ¶ä¼ç¹å¨äºèæ¶é¿ç å¹¶åæ è®° å 并忏 é¤ é¶æ®µé½ä¸éè¦æåç¨æ·çº¿ç¨ï¼å æ¤å ¶åé¡¿æ¶é´è¾çï¼å ¶ä¸»è¦ç¼ºç¹å¦ä¸ï¼
- ç±äºæ¶åå¹¶åæä½ï¼å æ¤å¯¹å¤çå¨èµæºæ¯è¾ææã
- ç±äºæ¯åºäº æ è®°-æ¸ é¤ ç®æ³å®ç°çï¼å æ¤ä¼äº§ç大é空é´ç¢çã
- æ æ³å¤çæµ®å¨åå¾ï¼Floating Garbageï¼ï¼ç±äºå¹¶åæ¸ é¤æ¶ç¨æ·çº¿ç¨è¿æ¯å¨ç»§ç»ï¼æä»¥æ¤æ¶ä»ç¶ä¼äº§çåå¾ï¼è¿äºåå¾å°±è¢«ç§°ä¸ºæµ®å¨åå¾ï¼åªè½çå°ä¸ä¸æ¬¡å徿¶éæ¶åè¿è¡æ¸ çã
5.7 Garbage First æ¶éå¨
Garbage Firstï¼ç®ç§° G1ï¼æ¯ä¸æ¬¾é¢åæå¡ç«¯çå徿¶éå¨ï¼ä¹æ¯ JDK 9 æå¡ç«¯æ¨¡å¼ä¸é»è®¤çå徿¶éå¨ï¼å®çè¯çå ·æéç¨ç¢å¼çæä¹ã
G1 è½ç¶ä¹éµå¾ªå代æ¶éç论ï¼ä½ä¸å以åºå®å¤§å°ååºå®æ°éæ¥ååå代åºåï¼èæ¯æè¿ç»ç Java å åå为å¤ä¸ªå¤§å°ç¸ççç¬ç«åºåï¼Regionï¼ãæ¯ä¸ä¸ª Region é½å¯ä»¥æ ¹æ®ä¸åçéæ±æ¥æ®æ¼æ°ç代ç Eden 空é´ãSurvivor ç©ºé´æè
è年代空é´ï¼æ¶éå¨ä¼æ ¹æ®å
¶æ®æ¼è§è²çä¸åèéç¨ä¸åçæ¶éçç¥ã

ä¸é¢è¿æä¸äº Region ä½¿ç¨ H è¿è¡æ 注ï¼å®ä»£è¡¨ Humongousï¼è¡¨ç¤ºè¿äº Region ç¨äºåå¨å¤§å¯¹è±¡ï¼humongous objectï¼H-objï¼ï¼å³å¤§å°å¤§äºçäº region ä¸åç对象ã
G1 æ¶éå¨çè¿è¡å¤§è´å¯ä»¥å为以ä¸å个æ¥éª¤ï¼
â ãåå§æ è®° (Inital Marking) ï¼æ è®° GC Roots è½ç´æ¥å
³èå°ç对象ï¼å¹¶ä¸ä¿®æ¹ TAMSï¼Top at Mark Startï¼æéçå¼ï¼è®©ä¸ä¸é¶æ®µç¨æ·çº¿ç¨å¹¶åè¿è¡æ¶ï¼è½å¤æ£ç¡®çå¨ Reigin ä¸åé
æ°å¯¹è±¡ã
G1 为æ¯ä¸ä¸ª Reigin é½è®¾è®¡äºä¸¤ä¸ªå为 TAMS çæéï¼æ°åé çå¯¹è±¡å¿ é¡»ä½äºè¿ä¸¤ä¸ªæéä½ç½®ä»¥ä¸ï¼ä½äºè¿ä¸¤ä¸ªæéä½ç½®ä»¥ä¸ç对象é»è®¤è¢«é弿 è®°ä¸ºåæ´»çï¼ä¸ä¼çº³å ¥åæ¶èå´ï¼
â¡ãå¹¶åæ è®° (Concurrent Marking) ï¼ä» GC Roots è½ç´æ¥å
³èå°ç对象å¼å§éåæ´ä¸ªå¯¹è±¡å¾ãéå宿åï¼è¿éè¦å¤ç SATB è®°å½ä¸åå¨ç对象ã
SATBï¼snapshot-at-the-beginningï¼å¼å§é¶æ®µå¿«ç §ï¼è½å¤ææçè§£å³å¹¶åæ è®°é¶æ®µå ä¸ºç¨æ·çº¿ç¨è¿è¡è导è´ç对象åå¨ï¼å ¶æçæ¯ CMS éæ°æ è®°é¶æ®µæä½¿ç¨çå¢éæ´æ°ç®æ³æçæ´é«ï¼
â¢ãæç»æ è®° (Final Marking) ï¼å¯¹ç¨æ·çº¿ç¨åä¸ä¸ªçæçæåï¼ç¨äºå¤çå¹¶åé¶æ®µç»æåä»éç䏿¥çå°éç STAB è®°å½ãè½ç¶å¹¶åæ è®°é¶æ®µä¼å¤ç SATB è®°å½ï¼ä½ç±äºå¤çæ¶ç¨æ·çº¿ç¨ä¾ç¶æ¯è¿è¡ä¸çï¼å æ¤ä¾ç¶ä¼æå°éçåå¨ï¼æä»¥éè¦æç»æ è®°æ¥å¤çï¼
â£ãçéåæ¶ (Live Data Counting and Evacuation) ï¼è´è´£æ´æ° Regin ç»è®¡æ°æ®ï¼æç §å个 Regin çåæ¶ä»·å¼åææ¬è¿è¡æåºï¼å¨æ ¹æ®ç¨æ·ææçåé¡¿æ¶é´è¿è¡æ¥æå®åæ¶è®¡åï¼å¯ä»¥éæ©ä»»æå¤ä¸ª Regin ææåæ¶éã
ç¶åå°åæ¶éä¸ Regin çåæ´»å¯¹è±¡å¤å¶å°ç©ºç Regin ä¸ï¼åæ¸ çææ´ä¸ªæ§ç Regin ãæ¤æ¶å 为æ¶åå°å活对象çç§»å¨ï¼æä»¥éè¦æåç¨æ·çº¿ç¨ï¼å¹¶ç±å¤ä¸ªæ¶é线ç¨å¹¶è¡æ§è¡ã

5.8 å ååé åå
1. 对象ä¼å å¨ Eden åé
大夿°æ
åµä¸ï¼å¯¹è±¡å¨æ°ç代ç Eden åºä¸è¿è¡åé
ï¼å½ Eden åºæ²¡æè¶³å¤ç©ºé´æ¶ï¼èææºå°è¿è¡ä¸æ¬¡ Minor GCã
2. å¤§å¯¹è±¡ç´æ¥è¿å ¥è年代
å¤§å¯¹è±¡å°±æ¯æéè¦å¤§éè¿ç»å å空é´ç Java å¯¹è±¡ï¼æå ¸åçå°±æ¯è¶ é¿çå符串æè å ç´ æ°éå¾å¤çæ°ç»ï¼å®ä»¬å°ç´æ¥è¿å ¥è年代ã
ä¸»è¦æ¯å ä¸ºå¦æå¨æ°ç代åé ï¼å ä¸ºå ¶éè¦å¤§éè¿ç»çå å空é´ï¼å¯è½ä¼å¯¼è´æå触ååå¾åæ¶ï¼å¹¶ä¸ç±äºæ°ç代çåå¾åæ¶æ¬èº«å°±å¾é¢ç¹ï¼æ¤æ¶å¤å¶å¤§å¯¹è±¡ä¹éè¦é¢å¤çæ§è½å¼éã
3. é¿æåæ´»ç对象å°è¿å ¥è年代
èææºä¼ç»æ¯ä¸ªå¯¹è±¡å¨å
¶å¯¹è±¡å¤´ä¸å®ä¹ä¸ä¸ªå¹´é¾è®¡æ°å¨ã对象éå¸¸å¨ Eden åºä¸è¯çï¼å¦æç»åç¬¬ä¸æ¬¡ Minor GC åä»ç¶åæ´»ï¼å¹¶ä¸è½å¤è¢« Survivor 容纳çè¯ï¼è¯¥å¯¹è±¡å°±ä¼è¢«ç§»å¨å° Survivor ä¸ï¼å¹¶å°å
¶å¹´é¾å 1ã
å¯¹è±¡å¨ Survivor 䏿¯ç»è¿ä¸æ¬¡ Minor GCï¼å¹´é¾å°±å 1ï¼å½å¹´é¾è¾¾å°ä¸å®ç¨åº¦åï¼ç± -XX:MaxTenuringThreshold 设置ï¼é»è®¤å¼ä¸º 15ï¼å°±ä¼è¿å
¥è年代ä¸ã
4. 卿年é¾å¤æ
å¦æå¨ Survivor 空é´ä¸ç¸åå¹´é¾çææå¯¹è±¡å¤§å°çæ»åå¤§äº Survivor 空é´çä¸åï¼é£ä¹å¹´é¾å¤§äºæçäºè¯¥å¹´é¾ç对象就å¯ä»¥ç´æ¥è¿å
¥è年代ï¼èæ éçå¾
å¹´é¾å°è¾¾ -XX:MaxTenuringThreshold 设置çå¼ã
5. ç©ºé´æ ä¿åé
å¨åç Minor GC ä¹åï¼èææºå¿ é¡»å æ£æ¥è年代æå¤§å¯ç¨çè¿ç»ç©ºé´æ¯å¦å¤§äºæ°ç代ææå¯¹è±¡çæ»ç©ºé´ï¼å¦ææ¡ä»¶æç«ï¼é£ä¹è¿ä¸æ¬¡ç Minor GC å¯ä»¥ç¡®è®¤æ¯å®å ¨çã
妿䏿ç«ï¼èææºä¼æ¥ç -XX:HandlePromotionFailure ç弿¯å¦å
许æ
ä¿å¤±è´¥ï¼å¦æå
许é£ä¹å°±ä¼ç»§ç»æ£æ¥è年代æå¤§å¯ç¨çè¿ç»ç©ºé´æ¯å¦å¤§äºå次æåå°è年代对象çå¹³å大å°ï¼å¦æå¤§äºï¼å°å°è¯çè¿è¡ä¸æ¬¡ Minor GCï¼å¦æå°äºæè
-XX:HandlePromotionFailure çå¼è®¾ç½®ä¸å
许åé©ï¼é£ä¹å°±è¦æ¹ä¸ºè¿è¡ä¸æ¬¡ Full GC ã
å ãç±»å è½½æºå¶
Java èææºææè¿°ç±»çæ°æ®ä» Class æä»¶å è½½å°å åï¼å¹¶å¯¹æ°æ®è¿è¡æ ¡éªã转æ¢è§£æååå§åï¼æç»å½¢æå¯ä»¥è¢«èææºç´æ¥ä½¿ç¨ç Java ç±»åï¼è¿ä¸ªè¿ç¨è¢«ç§°ä¸ºèææºçç±»å è½½æºå¶ã
6.1 ç±»å è½½æ¶æº
ä¸ä¸ªç±»ä»è¢«å è½½å°èææºå åä¸å¼å§ï¼å°å¸è½½åºå å为æ¢ï¼å®çæ´ä¸ªçå½å¨æå°ä¼ç»åå è½½ãéªè¯ãåå¤ãå¸è½½ãè§£æãåå§åã使ç¨ãå¸è½½ä¸ä¸ªé¶æ®µï¼å ¶ä¸éªè¯ãåå¤ãè§£æä¸ä¸ªé¨åç»ç§°ä¸ºè¿æ¥ï¼

ãJava èææºè§èãä¸¥æ ¼è§å®äºæä¸åªæå ç§æ åµå¿ é¡»ç«å³å¯¹ç±»è¿è¡åå§åï¼
â ãéå° newã getstaticã putstaticã invokestatic è¿åæ¡åèç æä»¤ï¼è½å¤çæè¿åæ¡æä»¤ç çå
¸å Java 代ç åºæ¯æï¼
- 使ç¨
newå ³é®åå®ä¾å对象æ¶ï¼ - 读åæè®¾ç½®ä¸ä¸ªç±»åçéæå段æ¶ï¼è¢« final 修饰ï¼å·²å¨ç¼è¯ææç»ææ¾å ¥å¸¸éæ± çéæå段é¤å¤ï¼ï¼
- è°ç¨ä¸ä¸ªç±»çéææ¹æ³æ¶ã
â¡ãä½¿ç¨ java.lang.reflect å
çæ¹æ³å¯¹ Class è¿è¡åå°è°ç¨æ¶ï¼å¦æç±»å没æè¿è¡è¿åå§åãåéè¦è§¦åå
¶åå§åï¼
â¢ãå½åå§åç±»æ¶ï¼å¦åç°å ¶ç¶ç±»è¿æ²¡æè¿è¡è¿åå§åãåéè¦è§¦åå ¶ç¶ç±»è¿è¡åå§åï¼
â£ãå½èææºå¯å¨æ¶ï¼ç¨æ·éè¦æå®ä¸ä¸ªè¦æ§è¡ç主类ï¼å å« main() æ¹æ³çé£ä¸ªç±»ï¼ï¼èææºä¼å åå§åè¿ä¸ªä¸»ç±»ï¼
â¤ãå½ä½¿ç¨ JDK 7 æ°å å
¥ç卿è¯è¨æ¯ææ¶ï¼å¦æä¸ä¸ª java.lang.invoke.MethodHandle å®ä¾æåè§£æçç»æä¸º REF_getStatic ï¼ REF_putStatic ï¼ REF_invokeStatic ï¼ REF_newInvokeSpecial åç§ç±»åçæ¹æ³å¥æï¼å¹¶ä¸è¿ä¸ªæ¹æ³å¥æå¯¹åºç类没æè¿è¡è¿åå§åï¼åéè¦å
触åå
¶åå§åï¼
â¥ãå½ä¸ä¸ªæ¥å£ä¸å®ä¹äº JDK 8 æ°å å ¥çé»è®¤æ¹æ³ï¼è¢« default å ³é®åä¿®é¥°çæ¥å£æ¹æ³ï¼æ¶ï¼å¦ææè¿ä¸ªæ¥å£çå®ç°ç±»åçäºåå§åï¼é£ä¹è¯¥æ¥å£è¦å¨å ¶ä¹å被åå§åã
6.2 ç±»å è½½è¿ç¨
1. å è½½
å¨å è½½é¶æ®µï¼èææºéè¦å®æä»¥ä¸ä¸ä»¶äºï¼
- éè¿ä¸ä¸ªç±»çå ¨éå®åæ¥è·åå®ä¹æ¤ç±»çäºè¿å¶åèæµ ï¼
- å°è¿ä¸ªåèæµæä»£è¡¨çéæåå¨ç»æè½¬æ¢ä¸ºè¿è¡æ¶æ°æ®ç»æï¼
- å¨å
åä¸çæä¸ä¸ªä»£è¡¨è¿ä¸ªç±»ç
java.lang.Class对象ï¼ä½ä¸ºè¿ä¸ªç±»çåç§æ°æ®ç访é®å ¥å£ã
ãJava èææºè§èã并没æéå¶ä»ä½å¤è·åäºè¿å¶æµï¼å æ¤å¯ä»¥ä» JAR å ãWAR å è·åï¼ä¹å¯ä»¥ä» JSP çæç Class æä»¶çå¤è·åã
2. éªè¯
è¿ä¸é¶æ®µçç®çæ¯ç¡®ä¿ Class æä»¶çåèæµä¸å å«çä¿¡æ¯ç¬¦åãJava èææºè§èãçå ¨é¨çº¦æè¦æ±ï¼ä»èä¿è¯è¿äºä¿¡æ¯è¢«å½å代ç è¿è¡åä¸ä¼å±å®³èææºèªèº«çå®å ¨ã
éªè¯é¶æ®µå¤§è´ä¼å®æä¸é¢å项éªè¯ï¼
- æä»¶æ ¼å¼éªè¯ï¼éªè¯åèæµæ¯å¦ç¬¦å Class æä»¶æ ¼å¼çè§èï¼
- å
æ°æ®éªè¯ï¼å¯¹åèç æè¿°çä¿¡æ¯è¿è¡è¯ä¹åæï¼ä»¥ä¿è¯å
¶æè¿°çä¿¡æ¯ç¬¦åãJava è¯è¨è§èãçè¦æ±ï¼å¦é¤äº
java.lang.Objectå¤ï¼ææçç±»é½åºè¯¥æç¶ç±»ï¼ï¼ - åèç éªè¯ï¼éè¿æ°æ®æµåæåæ§å¶æµåæï¼ç¡®å®ç¨åºè¯ä¹æ¯åæ³çï¼ç¬¦åé»è¾çï¼å¦å 许æå类对象èµå¼ç»ç¶ç±»æ°æ®ç±»åï¼ä½ä¸è½æç¶ç±»å¯¹è±¡èµå¼ç»åç±»æ°æ®ç±»åï¼ï¼
- 符å·å¼ç¨éªè¯ï¼éªè¯ç±»æ¯å¦ç¼ºå°æè
è¢«ç¦æ¢è®¿é®å®ä¾èµçæäºå¤é¨ç±»ãæ¹æ³ãåæ®µçèµæºãå¦ææ æ³éªè¯éè¿ï¼å伿åºä¸ä¸ª
java.lang.IncompatibleClassChangeErrorçåç±»å¼å¸¸ï¼å¦java.lang.NoSuchFieldErrorãjava.lang.NoSuchMethodErrorçã
3. åå¤
åå¤é¶æ®µæ¯æ£å¼ä¸ºç±»ä¸å®ä¹çåéï¼å³éæåéï¼è¢« static 修饰çåéï¼åé å å并设置类åéåå§å¼çé¶æ®µã
4. è§£æ
è§£ææ¯ Java èææºå°å¸¸éæ± å ç符å·å¼ç¨æ¿æ¢ä¸ºç´æ¥å¼ç¨çè¿ç¨ï¼
- 符å·å¼ç¨ï¼ç¬¦å·å¼ç¨ç¨ä¸ç»ç¬¦å·æ¥æè¿°æå¼ç¨çç®æ ï¼ç¬¦å·å¯ä»¥æ¯ä»»ä½å½¢å¼çåé¢éï¼åªè¦ä½¿ç¨æ¶è½æ æ§ä¹å°å®ä½å°ç®æ å³å¯ã
- ç´æ¥å¼ç¨ï¼ç´æ¥å¼ç¨æ¯æå¯ä»¥ç´æ¥æåç®æ çæéãç¸å¯¹åç§»éæè ä¸ä¸ªè½é´æ¥å®ä½å°ç®æ ç奿ã
æ´ä¸ªè§£æå¨ä½ä¸»è¦éå¯¹ç±»ææ¥å£ãåæ®µãç±»æ¹æ³ãæ¥å£æ¹æ³ãæ¹æ³ç±»åãæ¹æ³å¥æåè°ç¨ç¹éå®ç¬¦è¿ 7 类符å·å¼ç¨è¿è¡è§£æã
5. åå§å
åå§åé¶æ®µå°±æ¯æ§è¡ç±»æé å¨ç <clinit>() æ¹æ³çè¿ç¨ï¼è¯¥æ¹æ³å
·æä»¥ä¸ç¹ç¹ï¼
<clinit>()æ¹æ³ç±ç¼è¯å¨èªå¨æ¶éç±»ä¸ææç±»åéçèµå¼å¨ä½åéæè¯å¥åä¸çè¯å¥å并产çï¼ç¼è¯å¨æ¶é顺åºç±è¯å¥å¨æºæä»¶ä¸åºç°ç顺åºå³å®ã<clinit>()æ¹æ³ä¸ç±»çæé æ¹æ³ï¼å³å¨èææºè§è§ä¸çå®ä¾æé å¨<init>()æ¹æ³ï¼ä¸åï¼å®ä¸éè¦æ¾ç¤ºçè°ç¨ç¶ç±»çæé å¨ï¼Java èææºä¼ä¿è¯å¨åç±»ç<clinit>()æ¹æ³æ§è¡åï¼ç¶ç±»ç<clinit>()æ¹æ³å·²ç»æ§è¡å®æ¯ã- ç±äºç¶ç±»ç
<clinit>()æ¹æ³å æ§è¡ï¼ä¹å°±æå³çç¶ç±»ä¸å®ä¹çéæè¯å¥åè¦ä¼å äºåç±»åéçèµå¼æä½ã <clinit>()æ¹æ³å¯¹äºç±»æè æ¥å£ä¸æ¯å¿ é¡»çï¼å¦æä¸ä¸ªç±»ä¸æ²¡æéæè¯å¥åï¼ä¹æ²¡æå¯¹åéè¿è¡èµå¼æä½ï¼é£ä¹ç¼è¯å¨å¯ä»¥ä¸ä¸ºè¿ä¸ªç±»çæ<clinit>()æ¹æ³ã- æ¥å£ä¸ä¸è½ä½¿ç¨éæè¯å¥åï¼ä½ä»ç¶æåéåå§åçèµå¼æä½ï¼å æ¤æ¥å£ä¸ç±»ä¸æ ·é½ä¼çæ
<clinit>()æ¹æ³ã - Java èææºå¿
é¡»ä¿è¯ä¸ä¸ªç±»ç
<clinit>()æ¹æ³å¨å¤çº¿ç¨ç¯å¢ä¸è¢«æ£ç¡®çå é忥ï¼å¦æå¤ä¸ªçº¿ç¨åæ¶å»åå§åä¸ä¸ªç±»ï¼é£ä¹åªä¼æå ¶ä¸ä¸ä¸ªçº¿ç¨å»æ§è¡è¿ä¸ªç±»ç<clinit>()æ¹æ³ï¼å ¶ä»çº¿ç¨é½éè¦é»å¡çå¾ ã
6.3 ç±»å è½½å¨
è½å¤éè¿ä¸ä¸ªç±»çå ¨éå®åæ¥è·åæè¿°è¯¥ç±»çäºè¿å¶åèæµçå·¥å ·ç§°ä¸ºç±»å è½½å¨ã
æ¯ä¸ä¸ªç±»å è½½å¨é½æ¥æä¸ä¸ªç¬ç«çç±»å空é´ï¼å æ¤å¯¹äºä»»æä¸ä¸ªç±»ï¼é½å¿ é¡»ç±å è½½å®çç±»å è½½å¨åè¿ä¸ªç±»æ¬èº«æ¥å ±åç¡®ç«å ¶å¨ Java èææºä¸çå¯ä¸æ§ã
è¿æå³çè¦æ³æ¯è¾ä¸¤ä¸ªç±»æ¯å¦ç¸çï¼å¿ é¡»å¨åä¸ç±»å è½½å¨å è½½çåæä¸ï¼å¦æä¸¤ä¸ªç±»çç±»å è½½å¨ä¸åï¼åå®ä»¬ä¸å®ä¸ç¸çã
6.4 åäº²å§æ´¾æ¨¡å
ä» Java èææºè§åº¦èè¨ï¼ç±»å è½½å¨å¯ä»¥å为以ä¸ä¸¤ç±»ï¼
- å¯å¨ç±»å è½½å¨ ï¼å¯å¨ç±»å è½½å¨ï¼Bootstrap ClassLoaderï¼ç± C++ è¯è¨å®ç°ï¼ä»¥ HotSpot 为ä¾ï¼ï¼å®æ¯èææºèªèº«çä¸é¨åï¼
- å
¶ä»ææç±»çç±»å è½½å¨ ï¼ç± Java è¯è¨å®ç°ï¼ç¬ç«åå¨äºèææºå¤é¨ï¼å¹¶ä¸å
¨é¨ç»§æ¿èª
java.lang.ClassLoaderã
ä»å¼å人åè§åº¦èè¨ï¼ç±»å è½½å¨å¯ä»¥å为以ä¸ä¸ç±»ï¼
- å¯å¨ç±»å è½½å¨ (Boostrap Class Loader) ï¼è´è´£æåæ¾å¨
<JAVA_HOME>\libç®å½ä¸ï¼æè¢«-Xbootclasspathåæ°ææå®çè·¯å¾ä¸åæ¾çè½è¢« Java èææºè¯å«çç±»åºå è½½å°èææºçå åä¸ï¼ - æ©å±ç±»å è½½å¨ (Extension Class Loader) ï¼è´è´£å è½½
<JAVA_HOME>\lib\extç®å½ä¸ï¼æè¢«java.ext.dirsç³»ç»åéææå®çè·¯å¾ä¸çææç±»åºã - åºç¨ç¨åºç±»å è½½å¨ (Application Class Loader) ï¼è´è´£å è½½ç¨æ·ç±»è·¯å¾ï¼ClassPathï¼ä¸çææçç±»åºã
JDK 9 ä¹åç Java åºç¨é½æ¯ç±è¿ä¸ç§ç±»å è½½å¨ç¸äºé 忥宿å è½½ï¼

ä¸å¾æç¤ºçåç§ç±»å è½½å¨ä¹é´ç屿¬¡å ³ç³»è¢«ç§°ä¸ºç±»å è½½å¨ç âåäº²å§æ´¾æ¨¡åâï¼âåäº²å§æ´¾æ¨¡åâ è¦æ±é¤äºé¡¶å±çå¯å¨ç±»å è½½å¨å¤ï¼å ¶ä½çç±»å è½½å¨é½åºè¯¥æèªå·±çç¶ç±»å è½½å¨ï¼éè¦æ³¨æçæ¯è¿éçå è½½å¨ä¹é´çç¶åå ³ç³»ä¸è¬ä¸æ¯ä»¥ç»§æ¿å ³ç³»æ¥å®ç°çï¼èæ¯ä½¿ç¨ç»åå ³ç³»æ¥å¤ç¨ç¶ç±»å è½½å¨ç代ç ã
åäº²å§æ´¾æ¨¡åçå·¥ä½è¿ç¨å¦ä¸ï¼å¦æä¸ä¸ªç±»å è½½å¨æ¶å°äºç±»å è½½ç请æ±ï¼å®é¦å ä¸ä¼èªå·±å»å°è¯å è½½è¿ä¸ªç±»ï¼èæ¯æè¿ä¸ªè¯·æ±å§æ´¾ç»ç¶ç±»å è½½å¨å»å®æï¼æ¯ä¸å±çç±»å è½½å¨é½æ¯å¦æ¤ï¼å æ¤ææçå è½½è¯·æ±æç»é½åºè¯¥ä¼ éå°æé¡¶å±çå¯å¨ç±»å è½½å¨ï¼åªæå½ç¶å è½½å¨åé¦èªå·±æ æ³å®æè¿ä¸ªå 载请æ±ï¼å®çæç´¢èå´ä¸æ²¡ææ¾å°æéçç±»ï¼æ¶ï¼åå è½½å¨æä¼å°è¯èªå·±å»å®æå è½½ã
åºäºåäº²å§æ´¾æ¨¡åå¯ä»¥ä¿è¯ç¨åºä¸çç±»å¨åç§ç±»å è½½å¨ç¯å¢ä¸é½æ¯åä¸ä¸ªç±»ï¼å¦åå°±æå¯è½åºç°ä¸ä¸ªç¨åºä¸åå¨ä¸¤ä¸ªä¸åç java.lang.Object çæ
åµã
6.5 模ååä¸çç±»å è½½å¨
JDK 9 ä¹å为äºéåºæ¨¡ååçåå±ï¼ç±»å è½½å¨åäºå¦ä¸ååï¼
- ä»ç»´æä¸å±ç±»å è½½å¨ååäº²å§æ´¾çæ¶æï¼ä½æ©å±ç±»å è½½å¨è¢«å¹³å°ç±»å è½½å¨æå代ï¼
- å½å¹³å°ååºç¨ç¨åºç±»å è½½å¨æ¶å°ç±»å è½½è¯·æ±æ¶ï¼è¦é¦å å¤æè¯¥ç±»æ¯å¦è½å¤å½å±å°æä¸ä¸ªç³»ç»æ¨¡åä¸ï¼å¦æå¯ä»¥æ¾å°è¿æ ·çå½å±å ³ç³»ï¼å°±è¦ä¼å å§æ´¾ç»è´è´£é£ä¸ªæ¨¡åçå è½½å¨å®æå è½½ï¼
- å¯å¨ç±»å è½½å¨ãå¹³å°ç±»å è½½å¨ãåºç¨ç¨åºç±»å è½½å¨å
¨é¨ç»§æ¿èª
java.internal.loader.BuiltinClassLoaderï¼BuiltinClassLoader ä¸å®ç°äºæ°ç模ååæ¶æä¸ç±»å¦ä½ä»æ¨¡åä¸å è½½çé»è¾ï¼ä»¥å模åä¸èµæºå¯è®¿é®æ§çå¤çã

ä¸ãç¨åºç¼è¯
7.1 ç¼è¯å¨åç±»
- å端ç¼è¯å¨ï¼æ
*.javaæä»¶è½¬åæ.classæä»¶çè¿ç¨ï¼å¦ JDK ç Javacï¼Eclipse JDT ä¸çå¢éå¼ç¼è¯å¨ã - 峿¶ç¼è¯å¨ï¼å¸¸ç§°ä¸º JIT ç¼è¯å¨ï¼Just In Time Complierï¼ï¼å¨è¿è¡ææåèç è½¬åææ¬å°æºå¨ç çè¿ç¨ï¼å¦ HotSpot èææºä¸ç C1ãC2 ç¼è¯å¨ï¼Graal ç¼è¯å¨ã
- æåç¼è¯å¨ï¼ç´æ¥æç¨åºç¼è¯æç®æ æºå¨æä»¤éç¸å ³çäºè¿å¶ä»£ç çè¿ç¨ãå¦ JDK ç jaotcï¼GUN Compiler for the Javaï¼GCJï¼ï¼Excelsior JET ã
7.2 è§£éå¨ä¸ç¼è¯å¨
å¨ HotSpot ä¸ï¼Java ç¨åºæå齿¯éè¿è§£éå¨ï¼Interpreterï¼è¿è¡è§£éæ§è¡çï¼å ¶ä¼ç¹å¨äºå¯ä»¥çå»ç¼è¯æ¶é´ï¼è®©ç¨åºå¿«éå¯å¨ã
å½ç¨åºå¯å¨åï¼å¦æèææºåç°æä¸ªæ¹æ³æä»£ç åçè¿è¡ç¹å«é¢ç¹ï¼å°±ä¼ä½¿ç¨ç¼è¯å¨å°å ¶ç¼è¯ä¸ºæ¬å°æºå¨ç ï¼å¹¶ä½¿ç¨åç§ææ®µè¿è¡ä¼åï¼ä»èæé«æ§è¡æçï¼è¿å°±æ¯å³æ¶ç¼è¯å¨ã
HotSpot å ç½®äºä¸¤ä¸ªï¼æä¸ä¸ªï¼å³æ¶ç¼è¯å¨ï¼
- 客æ·ç«¯ç¼è¯å¨ (Client Complier) ï¼ç®ç§° C1ï¼
- æå¡ç«¯ç¼è¯å¨ (Servier Complier) ï¼ç®ç§° C2ï¼å¨æçèµæå JDK æºç ä¸ä¹ç§°ä¸º Opto ç¼è¯å¨ï¼
- Graal ç¼è¯å¨ ï¼å¨ JDK 10 æ¶æåºç°ï¼é¿æç®æ æ¯æ¿ä»£ C2ã
å¨åå±ç¼è¯ç工使¨¡å¼åºç°åï¼ä¸ç®¡æ¯éç¨å®¢æ·ç«¯ç¼è¯å¨è¿æ¯æå¡ç«¯ç¼è¯å¨å®å
¨åå³äºèææºæ¯è¿è¡å¨å®¢æ·ç«¯æ¨¡å¼è¿æ¯æå¡ç«¯æ¨¡å¼ä¸ï¼å¯ä»¥å¨å¯å¨æ¶éè¿ -client æ -server åæ°è¿è¡æå®ï¼ä¹å¯ä»¥è®©èææºæ ¹æ®èªèº«çæ¬åå®¿ä¸»æºæ§è½æ¥èªä¸»éæ©ã
7.3 åå±ç¼è¯
è¦ç¼è¯åºä¼åç¨åº¦è¶é«ç代ç é常é½éè¦è¶é¿çç¼è¯æ¶é´ï¼ä¸ºäºå¨ç¨åºå¯å¨é度ä¸è¿è¡æçä¹é´è¾¾å°æä½³å¹³è¡¡ï¼HotSpot å¨ç¼è¯åç³»ç»ä¸å å ¥äºåå±ç¼è¯ï¼Tiered Compilationï¼ï¼
- 第 0 å±ï¼ç¨åºçº¯è§£éæ§è¡ï¼å¹¶ä¸è§£éå¨ä¸å¼å¯æ§è½çæ§åè½ï¼
- 第 1 å±ï¼ä½¿ç¨å®¢æ·ç«¯ç¼è¯å¨å°åèç ç¼è¯ä¸ºæ¬å°ä»£ç æ¥è¿è¡ï¼è¿è¡ç®åå¯é ç稳å®ä¼åï¼ä¸å¼å¯æ§è½çæ§åè½ï¼
- 第 2 å±ï¼ä»ç¶ä½¿ç¨å®¢æ·ç«¯ç¼è¯æ§è¡ï¼ä» å¼å¯æ¹æ³åå边次æ°ç»è®¡çæéçæ§è½çæ§ï¼
- 第 3 å±ï¼ä»ç¶ä½¿ç¨å®¢æ·ç«¯ç¼è¯æ§è¡ï¼å¼å¯å ¨é¨æ§è½çæ§ï¼
- 第 4 å±ï¼ä½¿ç¨æå¡ç«¯ç¼è¯å¨å°åèç ç¼è¯ä¸ºæ¬å°ä»£ç ï¼å ¶èæ¶æ´é¿ï¼å¹¶ä¸ä¼æ ¹æ®æ§è½çæ§ä¿¡æ¯è¿è¡ä¸äºä¸å¯é çæ¿è¿ä¼åã
以ä¸å±æ¬¡å¹¶ä¸æ¯åºå®ä¸åçï¼æ ¹æ®ä¸åçè¿è¡åæ°åçæ¬ï¼èææºå¯ä»¥è°æ´åå±çæ°éãå屿¬¡ç¼è¯ä¹é´ç交äºè½¬æ¢å ³ç³»å¦ä¸å¾æç¤ºï¼

宿½åå±ç¼è¯åï¼è§£éå¨ã客æ·ç«¯ç¼è¯å¨åæå¡ç«¯ç¼è¯å¨å°±ä¼åæ¶å·¥ä½ï¼å¯ä»¥ç¨å®¢æ·ç«¯ç¼è¯å¨è·åæ´é«çç¼è¯é度ãç¨æå¡ç«¯ç¼è¯å¨æ¥è·åæ´å¥½çç¼è¯è´¨éã
7.4 çç¹æ¢æµ
峿¶ç¼è¯å¨ç¼è¯çç®æ æ¯ âçç¹ä»£ç âï¼å®ä¸»è¦å为以ä¸ä¸¤ç±»ï¼
- è¢«å¤æ¬¡è°ç¨çæ¹æ³ã
- è¢«å¤æ¬¡æ§è¡å¾ªç¯ä½ãè¿éæçæ¯ä¸ä¸ªæ¹æ³åªè¢«å°éè°ç¨è¿ï¼ä½æ¹æ³ä½å é¨åå¨å¾ªç¯æ¬¡æ°è¾å¤ç循ç¯ä½ï¼æ¤æ¶ä¹è®¤ä¸ºæ¯çç¹ä»£ç ãä½ç¼è¯å¨ç¼è¯çä»ç¶æ¯å¾ªç¯ä½æå¨çæ¹æ³ï¼èä¸ä¼åç¬ç¼è¯å¾ªç¯ä½ã
å¤æææ®µä»£ç æ¯å¦æ¯çç¹ä»£ç çè¡ä¸ºç§°ä¸º âçç¹æ¢æµâ ï¼Hot Spot Code Detectionï¼ï¼ä¸»æµççç¹æ¢æµæ¹æ³æä»¥ä¸ä¸¤ç§ï¼
- åºäºéæ ·ççç¹æ¢æµ (Sample Based Hot Spot Code Detection) ï¼éç¨è¿ç§æ¹æ³çèææºä¼å¨ææ§å°æ£æ¥å个线ç¨çè°ç¨æ é¡¶ï¼å¦æåç°æä¸ªï¼ææäºï¼æ¹æ³ç»å¸¸åºç°å¨æ é¡¶ï¼é£ä¹å°±è®¤ä¸ºå®æ¯ âçç¹æ¹æ³âã
- åºäºè®¡æ°ççç¹æ¢æµ (Counter Based Hot Spot Code Detection) ï¼éç¨è¿ç§æ¹æ³çèææºä¼ä¸ºæ¯ä¸ªæ¹æ³ï¼çè³æ¯ä»£ç åï¼å»ºç«è®¡æ°å¨ï¼ç»è®¡æ¹æ³çæ§è¡æ¬¡æ°ï¼å¦ææ§è¡æ¬¡æ°è¶ è¿ä¸å®çéå¼å°±è®¤ä¸ºå®æ¯ âçç¹æ¹æ³âã
å «ã代ç ä¼å
峿¶ç¼è¯å¨é¤äºå°åèç ç¼è¯ä¸ºæ¬å°æºå¨ç å¤ï¼è¿ä¼å¯¹ä»£ç è¿è¡ä¸å®ç¨åº¦çä¼åï¼å®å å«å¤è¾¾å åç§ä¼åææ¯ï¼è¿ééåå ¶ä¸ä»£è¡¨æ§çåç§è¿è¡ä»ç»ï¼
8.1 æ¹æ³å è
æéè¦çä¼åææ®µï¼å®ä¼å°ç®æ æ¹æ³ä¸ç代ç åå°ä¸å¨å° âå¤å¶â å°åèµ·è°ç¨çæ¹æ³ä¹ä¸ï¼é¿å åççå®çæ¹æ³è°ç¨ï¼å¹¶éç¨å为类åç»§æ¿å ³ç³»åæï¼Class Hierarchy Analysisï¼CHAï¼çææ¯æ¥è§£å³èæ¹æ³ï¼Java è¯è¨ä¸é»è®¤çå®ä¾æ¹æ³é½æ¯èæ¹æ³ï¼çå èé®é¢ã
8.2 éé¸åæ
éé¸è¡ä¸ºä¸»è¦å为以ä¸ä¸¤ç±»ï¼
- æ¹æ³éé¸ï¼å½ä¸ä¸ªå¯¹è±¡å¨æ¹æ³éé¢è¢«å®ä¹åï¼å®å¯è½è¢«å¤é¨æ¹æ³æå¼ç¨ï¼ä¾å¦ä½ä¸ºè°ç¨åæ°ä¼ éå°å ¶ä»æ¹æ³ä¸ï¼æ¤æ¶ç§°ä¸ºæ¹æ³éé¸ï¼
- 线ç¨éé¸ï¼å½ä¸ä¸ªå¯¹è±¡å¨æ¹æ³éé¢è¢«å®ä¹åï¼å®å¯è½è¢«å¤é¨çº¿ç¨æè®¿é®ï¼ä¾å¦èµå¼ç»å¯ä»¥å¨å ¶ä»çº¿ç¨ä¸è®¿é®çå®ä¾åéï¼æ¤æ¶ç§°ä¸ºçº¿ç¨éé¸ï¼å ¶éé¸ç¨åº¦é«äºæ¹æ³éé¸ã
public static StringBuilder concat(String... strings) {
StringBuilder sb = new StringBuilder();
for (String string : strings) {
sb.append(string);
}
return sb; // åçäºæ¹æ³éé¸
}
public static String concat(String... strings) {
StringBuilder sb = new StringBuilder();
for (String string : strings) {
sb.append(string);
}
return sb.toString(); // 没æåçæ¹æ³éé¸
}妿è½è¯æä¸ä¸ªå¯¹è±¡ä¸ä¼éé¸å°æ¹æ³æçº¿ç¨ä¹å¤ï¼æè éé¸ç¨åº¦æ¯è¾ä½ï¼åªéé¸åºæ¹æ³èä¸ä¼éé¸åºçº¿ç¨ï¼ï¼åå¯ä»¥å¯¹è¿ä¸ªå¯¹è±¡å®ä¾éåä¸åç¨åºçä¼åï¼
- æ ä¸åé (Stack Allocations) ï¼å¦æä¸ä¸ªå¯¹è±¡ä¸ä¼éé¸å°çº¿ç¨å¤ï¼é£ä¹å°ä¼å¨æ ä¸åé å 忥å建è¿ä¸ªå¯¹è±¡ï¼è䏿¯ Java å ä¸ï¼æ¤æ¶å¯¹è±¡æå ç¨çå å空é´å°±ä¼éçæ å¸§çåºæ è鿝ï¼ä»èå¯ä»¥åè½»åå¾åæ¶çååã
- æ éæ¿æ¢ (Scalar Replacement) ï¼å¦æä¸ä¸ªæ°æ®å·²ç»æ æ³ååè§£æä¸ºæ´å°çæ°æ®ç±»åï¼é£ä¹è¿äºæ°æ®å°±ç§°ä¸ºæ éï¼å¦ intãlong çæ°å¼ç±»åå reference ç±»åçï¼ï¼åä¹ï¼å¦æä¸ä¸ªæ°æ®å¯ä»¥ç»§ç»åè§£ï¼é£å®å°±è¢«ç§°ä¸ºèåéï¼å¦å¯¹è±¡ï¼ã妿ä¸ä¸ªå¯¹è±¡ä¸ä¼éé¸å¤æ¹æ³å¤ï¼é£ä¹å°±å¯ä»¥å°å ¶æ¹ä¸ºç´æ¥å建è¥å¹²ä¸ªè¢«è¿ä¸ªæ¹æ³ä½¿ç¨çæåå鿥æ¿ä»£ï¼ä»èåå°å åå ç¨ã
- 忥æ¶é¤ (Synchronization Elimination) ï¼å¦æä¸ä¸ªåéä¸ä¼éé¸åºçº¿ç¨ï¼é£ä¹å¯¹è¿ä¸ªåé宿½çåæ¥æªæ½å°±å¯ä»¥æ¶é¤æã
8.3 å ¬å ±åè¡¨è¾¾å¼æ¶é¤
妿ä¸ä¸ªè¡¨è¾¾å¼ E ä¹åå·²ç»è¢«è®¡ç®è¿äºï¼å¹¶ä¸ä»å åç计ç®å°ç°å¨ E 䏿æåéçå¼é½æ²¡æåçè¿ååï¼é£ä¹ E è¿æ¬¡çåºç°å°±ç§°ä¸ºå ¬å ±å表达å¼ã对äºè¿ç§è¡¨è¾¾å¼ï¼æ éåéæ°è¿è¡è®¡ç®ï¼åªéè¦ç´æ¥ä½¿ç¨åé¢ç计ç®ç»æå³å¯ã
8.4 æ°ç»è¾¹çæ£æ¥æ¶é¤
对äºèææºæ§è¡åç³»ç»æ¥è¯´ï¼æ¯æ¬¡æ°ç»å
ç´ ç读åé½å¸¦æä¸æ¬¡éå«çä¸ä¸ææ£æ¥ä»¥é¿å
访é®è¶çã妿æ°ç»ç访é®åçå¨å¾ªç¯ä¹ä¸ï¼å¹¶ä¸ä½¿ç¨å¾ªç¯åéæ¥è®¿é®æ°æ®ï¼å³å¾ªç¯åéçå弿°¸è¿å¨ [0ï¼list.length) ä¹é´ï¼é£ä¹æ¤æ¶å°±å¯ä»¥æ¶é¤æ´ä¸ªå¾ªç¯çæ°æ®è¾¹çæ£æ¥ï¼ä»èé¿å
夿¬¡æ ç¨ç夿ã
å°ç»
è¿ç¯å 容æä»¬ç³»ç»å°æ»ç»äº JVM æéè¦çç¥è¯ç¹ï¼æ¯å¦è¯´ JVM çå åç»æãåå¾åæ¶ç®æ³ãåå¾åæ¶å¨ãç±»å è½½æºå¶ãç±»å è½½å¨ãç¨åºç¼è¯ã代ç ä¼åççï¼å¸æè½å¯¹å¤§å®¶å¨å¦ä¹ JVM çæ¶åææå¸®å©ã
- åè龿¥ï¼https://github.com/heibaiying/Full-Stack-Notes
- æ´çï¼æ²é»çäº
GitHub 䏿 æ 10000+ ç弿ºç¥è¯åºãäºå¥ç Java è¿é¶ä¹è·¯ã第ä¸ç PDF ç»äºæ¥äºï¼å æ¬Javaåºç¡è¯æ³ãæ°ç»&å符串ãOOPãéåæ¡æ¶ãJava IOãå¼å¸¸å¤çãJava æ°ç¹æ§ãç½ç»ç¼ç¨ãNIOãå¹¶åç¼ç¨ãJVMççï¼å ±è®¡ 32 ä¸ä½åï¼500+å¼ æç»å¾ï¼å¯ä»¥è¯´æ¯éä¿ææãé£è¶£å¹½é»â¦â¦è¯¦æ æ³ï¼å¤ªèµäºï¼GitHub 䏿 æ 10000+ ç Java æç¨
å¾®ä¿¡æ æ²é»çäº ææ«æä¸æ¹äºç»´ç å ³æ³¨äºå¥çååå ¬ä¼å·æ²é»çäºï¼åå¤ 222 å³å¯å è´¹é¢åã

