---
title: ç±»å è½½è¿ç¨è¯¦è§£
category: Java
tag:
- JVM
---
## ç±»ççå½å¨æ
ç±»ä»è¢«å è½½å°èææºå
åä¸å¼å§å°å¸è½½åºå
å为æ¢ï¼å®çæ´ä¸ªçå½å¨æå¯ä»¥ç®åæ¦æ¬ä¸º 7 ä¸ªé¶æ®µï¼ï¼å è½½ï¼Loadingï¼ãéªè¯ï¼Verificationï¼ãåå¤ï¼Preparationï¼ãè§£æï¼Resolutionï¼ãåå§åï¼Initializationï¼ã使ç¨ï¼Usingï¼åå¸è½½ï¼Unloadingï¼ãå
¶ä¸ï¼åä¸ä¸ªé¶æ®µå¯ä»¥ç»ç§°ä¸ºè¿æ¥ï¼Linkingï¼ã
è¿ 7 ä¸ªé¶æ®µç顺åºå¦ä¸å¾æç¤ºï¼

## ç±»å è½½è¿ç¨
**Class æä»¶éè¦å è½½å°èææºä¸ä¹åæè½è¿è¡å使ç¨ï¼é£ä¹èææºæ¯å¦ä½å è½½è¿äº Class æä»¶å¢ï¼**
ç³»ç»å è½½ Class ç±»åçæä»¶ä¸»è¦ä¸æ¥ï¼**å è½½->è¿æ¥->åå§å**ãè¿æ¥è¿ç¨åå¯åä¸ºä¸æ¥ï¼**éªè¯->åå¤->è§£æ**ã

è¯¦è§ [Java Virtual Machine Specification - 5.3. Creation and Loading](https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-5.html#jvms-5.3 "Java Virtual Machine Specification - 5.3. Creation and Loading")ã
### å è½½
ç±»å è½½è¿ç¨çç¬¬ä¸æ¥ï¼ä¸»è¦å®æä¸é¢ 3 ä»¶äºæ
ï¼
1. éè¿å
¨ç±»åè·åå®ä¹æ¤ç±»çäºè¿å¶åèæµã
2. å°åèæµæä»£è¡¨çéæåå¨ç»æè½¬æ¢ä¸ºæ¹æ³åºçè¿è¡æ¶æ°æ®ç»æã
3. å¨å
åä¸çæä¸ä¸ªä»£è¡¨è¯¥ç±»ç `Class` 对象ï¼ä½ä¸ºæ¹æ³åºè¿äºæ°æ®ç访é®å
¥å£ã
èææºè§èä¸é¢è¿ 3 ç¹å¹¶ä¸å
·ä½ï¼å æ¤æ¯éå¸¸çµæ´»çãæ¯å¦ï¼"éè¿å
¨ç±»åè·åå®ä¹æ¤ç±»çäºè¿å¶åèæµ" å¹¶æ²¡æææå
·ä½ä»åªéè·åï¼ `ZIP`ã `JAR`ã`EAR`ã`WAR`ãç½ç»ãå¨æä»£çææ¯è¿è¡æ¶å¨æçæãå
¶ä»æä»¶çææ¯å¦ `JSP`...ï¼ãææ ·è·åã
å è½½è¿ä¸æ¥ä¸»è¦æ¯éè¿æä»¬åé¢è¦è®²å°ç **ç±»å è½½å¨** 宿çãç±»å è½½å¨æå¾å¤ç§ï¼å½æä»¬æ³è¦å è½½ä¸ä¸ªç±»çæ¶åï¼å
·ä½æ¯åªä¸ªç±»å è½½å¨å è½½ç± **åäº²å§æ´¾æ¨¡å** å³å®ï¼ä¸è¿ï¼æä»¬ä¹è½æç ´ç±åäº²å§æ´¾æ¨¡åï¼ã
> ç±»å è½½å¨ãåäº²å§æ´¾æ¨¡å乿¯é常éè¦çç¥è¯ç¹ï¼è¿é¨åå
容å¨[ç±»å è½½å¨è¯¦è§£](https://javaguide.cn/java/jvm/classloader.html "ç±»å è½½å¨è¯¦è§£")è¿ç¯æç« ä¸æè¯¦ç»ä»ç»å°ãé
读æ¬ç¯æç« çæ¶åï¼å¤§å®¶ç¥éæè¿ä¹ä¸ªä¸è¥¿å°±å¯ä»¥äºã
æ¯ä¸ª Java ç±»é½æä¸ä¸ªå¼ç¨æåå è½½å®ç `ClassLoader`ãä¸è¿ï¼æ°ç»ç±»ä¸æ¯éè¿ `ClassLoader` å建çï¼èæ¯ JVM å¨éè¦çæ¶åèªå¨å建çï¼æ°ç»ç±»éè¿`getClassLoader()`æ¹æ³è·å `ClassLoader` çæ¶åå该æ°ç»çå
ç´ ç±»åç `ClassLoader` æ¯ä¸è´çã
ä¸ä¸ªéæ°ç»ç±»çå è½½é¶æ®µï¼å è½½é¶æ®µè·åç±»çäºè¿å¶åèæµçå¨ä½ï¼æ¯å¯æ§æ§æå¼ºçé¶æ®µï¼è¿ä¸æ¥æä»¬å¯ä»¥å»å®æè¿å¯ä»¥èªå®ä¹ç±»å è½½å¨å»æ§å¶åèæµçè·åæ¹å¼ï¼éåä¸ä¸ªç±»å è½½å¨ç `loadClass()` æ¹æ³ï¼ã
å è½½é¶æ®µä¸è¿æ¥é¶æ®µçé¨åå¨ä½(å¦ä¸é¨ååèç æä»¶æ ¼å¼éªè¯å¨ä½)æ¯äº¤åè¿è¡çï¼å è½½é¶æ®µå°æªç»æï¼è¿æ¥é¶æ®µå¯è½å°±å·²ç»å¼å§äºã
### éªè¯
**éªè¯æ¯è¿æ¥é¶æ®µçç¬¬ä¸æ¥ï¼è¿ä¸é¶æ®µçç®çæ¯ç¡®ä¿ Class æä»¶çåèæµä¸å
å«çä¿¡æ¯ç¬¦åãJava èææºè§èãçå
¨é¨çº¦æè¦æ±ï¼ä¿è¯è¿äºä¿¡æ¯è¢«å½ä½ä»£ç è¿è¡åä¸ä¼å±å®³èææºèªèº«çå®å
¨ã**
éªè¯é¶æ®µè¿ä¸æ¥å¨æ´ä¸ªç±»å è½½è¿ç¨ä¸èè´¹çèµæºè¿æ¯ç¸å¯¹è¾å¤çï¼ä½å¾æå¿
è¦ï¼å¯ä»¥ææé²æ¢æ¶æä»£ç çæ§è¡ã任使¶åï¼ç¨åºå®å
¨é½æ¯ç¬¬ä¸ä½ã
ä¸è¿ï¼éªè¯é¶æ®µä¹ä¸æ¯å¿
é¡»è¦æ§è¡çé¶æ®µã妿ç¨åºè¿è¡çå
¨é¨ä»£ç (å
æ¬èªå·±ç¼åçãç¬¬ä¸æ¹å
ä¸çãä»å¤é¨å è½½çã卿çæççææä»£ç )é½å·²ç»è¢«åå¤ä½¿ç¨åéªè¯è¿ï¼å¨ç产ç¯å¢ç宿½é¶æ®µå°±å¯ä»¥èèä½¿ç¨ `-Xverify:none` åæ°æ¥å
³é大é¨åçç±»éªè¯æªæ½ï¼ä»¥ç¼©çèææºç±»å è½½çæ¶é´ã
éªè¯é¶æ®µä¸»è¦ç±å个æ£éªé¶æ®µç»æï¼
1. æä»¶æ ¼å¼éªè¯ï¼Class æä»¶æ ¼å¼æ£æ¥ï¼
2. å
æ°æ®éªè¯ï¼åèç è¯ä¹æ£æ¥ï¼
3. åèç éªè¯ï¼ç¨åºè¯ä¹æ£æ¥ï¼
4. 符å·å¼ç¨éªè¯ï¼ç±»çæ£ç¡®æ§æ£æ¥ï¼

æä»¶æ ¼å¼éªè¯è¿ä¸é¶æ®µæ¯åºäºè¯¥ç±»çäºè¿å¶åèæµè¿è¡çï¼ä¸»è¦ç®çæ¯ä¿è¯è¾å
¥çåèæµè½æ£ç¡®å°è§£æå¹¶åå¨äºæ¹æ³åºä¹å
ï¼æ ¼å¼ä¸ç¬¦åæè¿°ä¸ä¸ª Java ç±»åä¿¡æ¯çè¦æ±ãé¤äºè¿ä¸é¶æ®µä¹å¤ï¼å
¶ä½ä¸ä¸ªéªè¯é¶æ®µé½æ¯åºäºæ¹æ³åºçåå¨ç»æä¸è¿è¡çï¼ä¸ä¼åç´æ¥è¯»åãæä½åèæµäºã
> æ¹æ³åºå±äºæ¯ JVM è¿è¡æ¶æ°æ®åºåçä¸åé»è¾åºåï¼æ¯å个线ç¨å
±äº«çå
ååºåãå½èææºè¦ä½¿ç¨ä¸ä¸ªç±»æ¶ï¼å®éè¦è¯»åå¹¶è§£æ Class æä»¶è·åç¸å
³ä¿¡æ¯ï¼åå°ä¿¡æ¯åå
¥å°æ¹æ³åºãæ¹æ³åºä¼åå¨å·²è¢«èææºå è½½ç **类信æ¯ãåæ®µä¿¡æ¯ãæ¹æ³ä¿¡æ¯ã常éãéæåéã峿¶ç¼è¯å¨ç¼è¯åç代ç ç¼åçæ°æ®**ã
>
> å
³äºæ¹æ³åºç详ç»ä»ç»ï¼æ¨èé
读 [Java å
ååºå详解](https://javaguide.cn/java/jvm/memory-area.html "Java å
ååºå详解") è¿ç¯æç« ã
符å·å¼ç¨éªè¯åçå¨ç±»å è½½è¿ç¨ä¸çè§£æé¶æ®µï¼å
·ä½ç¹è¯´æ¯ JVM å°ç¬¦å·å¼ç¨è½¬åä¸ºç´æ¥å¼ç¨çæ¶åï¼è§£æé¶æ®µä¼ä»ç»ç¬¦å·å¼ç¨åç´æ¥å¼ç¨ï¼ã
符å·å¼ç¨éªè¯ç主è¦ç®çæ¯ç¡®ä¿è§£æé¶æ®µè½æ£å¸¸æ§è¡ï¼å¦ææ æ³éè¿ç¬¦å·å¼ç¨éªè¯ï¼JVM 伿åºå¼å¸¸ï¼æ¯å¦ï¼
- `java.lang.IllegalAccessError`ï¼å½ç±»è¯å¾è®¿é®æä¿®æ¹å®æ²¡ææé访é®çåæ®µï¼æè°ç¨å®æ²¡ææé访é®çæ¹æ³æ¶ï¼æåºè¯¥å¼å¸¸ã
- `java.lang.NoSuchFieldError`ï¼å½ç±»è¯å¾è®¿é®æä¿®æ¹ä¸ä¸ªæå®çå¯¹è±¡åæ®µï¼è该对象ä¸åå
å«è¯¥å段æ¶ï¼æåºè¯¥å¼å¸¸ã
- `java.lang.NoSuchMethodError`ï¼å½ç±»è¯å¾è®¿é®ä¸ä¸ªæå®çæ¹æ³ï¼èè¯¥æ¹æ³ä¸å卿¶ï¼æåºè¯¥å¼å¸¸ã
- ......
### åå¤
**åå¤é¶æ®µæ¯æ£å¼ä¸ºç±»åéåé
å
å并设置类åéåå§å¼çé¶æ®µ**ï¼è¿äºå
åé½å°å¨æ¹æ³åºä¸åé
ã对äºè¯¥é¶æ®µæä»¥ä¸å ç¹éè¦æ³¨æï¼
1. è¿æ¶åè¿è¡å
ååé
çä»
å
æ¬ç±»åéï¼ Class Variables ï¼å³éæåéï¼è¢« `static` å
³é®å修饰çåéï¼åªä¸ç±»ç¸å
³ï¼å æ¤è¢«ç§°ä¸ºç±»åéï¼ï¼èä¸å
æ¬å®ä¾åéãå®ä¾åéä¼å¨å¯¹è±¡å®ä¾åæ¶éç对象ä¸ååé
å¨ Java å ä¸ã
2. 仿¦å¿µä¸è®²ï¼ç±»åéæä½¿ç¨çå
åé½åºå½å¨ **æ¹æ³åº** ä¸è¿è¡åé
ãä¸è¿æä¸ç¹éè¦æ³¨æçæ¯ï¼JDK 7 ä¹åï¼HotSpot ä½¿ç¨æ°¸ä¹
代æ¥å®ç°æ¹æ³åºçæ¶åï¼å®ç°æ¯å®å
¨ç¬¦åè¿ç§é»è¾æ¦å¿µçã èå¨ JDK 7 åä¹åï¼HotSpot å·²ç»æåæ¬æ¾å¨æ°¸ä¹
代çåç¬¦ä¸²å¸¸éæ± ãéæåéçç§»å¨å°å ä¸ï¼è¿ä¸ªæ¶åç±»åéåä¼éç Class 对象ä¸èµ·åæ¾å¨ Java å ä¸ãç¸å
³é
读ï¼[ãæ·±å
¥çè§£ Java èææºï¼ç¬¬ 3 çï¼ãå误#75](https://github.com/fenixsoft/jvm_book/issues/75 "ãæ·±å
¥çè§£Javaèææºï¼ç¬¬3çï¼ãå误#75")
3. è¿éæè®¾ç½®çåå§å¼"é常æ
åµ"䏿¯æ°æ®ç±»åé»è®¤çé¶å¼ï¼å¦ 0ã0Lãnullãfalse çï¼ï¼æ¯å¦æä»¬å®ä¹äº`public static int value=111` ï¼é£ä¹ value åéå¨åå¤é¶æ®µçåå§å¼å°±æ¯ 0 è䏿¯ 111ï¼åå§åé¶æ®µæä¼èµå¼ï¼ãç¹æ®æ
åµï¼æ¯å¦ç» value åéå ä¸äº final å
³é®å`public static final int value=111` ï¼é£ä¹åå¤é¶æ®µ value çå¼å°±è¢«èµå¼ä¸º 111ã
**åºæ¬æ°æ®ç±»åçé¶å¼**ï¼(å¾çæ¥èªãæ·±å
¥çè§£ Java èææºã第 3 ç 7.33 )

### è§£æ
**è§£æé¶æ®µæ¯èææºå°å¸¸éæ± å
ç符å·å¼ç¨æ¿æ¢ä¸ºç´æ¥å¼ç¨çè¿ç¨ã** è§£æå¨ä½ä¸»è¦éå¯¹ç±»ææ¥å£ãåæ®µãç±»æ¹æ³ãæ¥å£æ¹æ³ãæ¹æ³ç±»åãæ¹æ³å¥æåè°ç¨éå®ç¬¦ 7 类符å·å¼ç¨è¿è¡ã
ãæ·±å
¥çè§£ Java èææºã7.34 è第ä¸ç对符å·å¼ç¨åç´æ¥å¼ç¨çè§£éå¦ä¸ï¼

举个ä¾åï¼å¨ç¨åºæ§è¡æ¹æ³æ¶ï¼ç³»ç»éè¦æç¡®ç¥éè¿ä¸ªæ¹æ³æå¨çä½ç½®ãJava èææºä¸ºæ¯ä¸ªç±»é½åå¤äºä¸å¼ æ¹æ³è¡¨æ¥åæ¾ç±»ä¸ææçæ¹æ³ãå½éè¦è°ç¨ä¸ä¸ªç±»çæ¹æ³çæ¶åï¼åªè¦ç¥éè¿ä¸ªæ¹æ³å¨æ¹æ³è¡¨ä¸çåç§»éå°±å¯ä»¥ç´æ¥è°ç¨è¯¥æ¹æ³äºãéè¿è§£ææä½ç¬¦å·å¼ç¨å°±å¯ä»¥ç´æ¥è½¬åä¸ºç®æ æ¹æ³å¨ç±»ä¸æ¹æ³è¡¨çä½ç½®ï¼ä»èä½¿å¾æ¹æ³å¯ä»¥è¢«è°ç¨ã
综ä¸ï¼è§£æé¶æ®µæ¯èææºå°å¸¸éæ± å
ç符å·å¼ç¨æ¿æ¢ä¸ºç´æ¥å¼ç¨çè¿ç¨ï¼ä¹å°±æ¯å¾å°ç±»æè
åæ®µãæ¹æ³å¨å
åä¸çæéæè
åç§»éã
### åå§å
**åå§åé¶æ®µæ¯æ§è¡åå§åæ¹æ³ `