ä»å®è§ä¸ä»ç»ä¸ä¸Javaèææºçå·¥ä½åçãä»æåç¼åçJavaæºæ件ï¼.javaæ件ï¼æ¯å¦ä½ä¸æ¥æ¥æ§è¡çï¼å¦ä¸å¾æ示ï¼é¦å Javaæºæ件ç»è¿å端ç¼è¯å¨ï¼javacæECJï¼å°.javaæ件ç¼è¯ä¸ºJavaåèç æ件ï¼ç¶åJREå è½½Javaåèç æ件ï¼è½½å ¥ç³»ç»åé ç»JVMçå ååºï¼ç¶åæ§è¡å¼æ解éæç¼è¯ç±»æ件ï¼åç±å³æ¶ç¼è¯å¨å°åèç 转å为æºå¨ç ã主è¦ä»ç»ä¸å¾ä¸çç±»å è½½å¨åè¿è¡æ¶æ°æ®åºä¸¤ä¸ªé¨åã
ï¼1ï¼ç±»å è½½æå°ç±»çåèç æ件ï¼.classï¼ä¸çäºè¿å¶æ°æ®è¯»å ¥å åï¼å°å ¶æ¾å¨è¿è¡æ¶æ°æ®åºçæ¹æ³åºå ï¼ç¶åå¨å ä¸å建java.lang.Class对象ï¼å°è£ ç±»å¨æ¹æ³åºå çæ°æ®ç»æãç±»å è½½çæç»äº§åæ¯ä½äºå ä¸ç类对象ï¼ç±»å¯¹è±¡å°è£ äºç±»å¨æ¹æ³åºå çæ°æ®ç»æï¼å¹¶ä¸åJAVAç¨åºæä¾äºè®¿é®æ¹æ³åºå æ°æ®ç»æçæ¥å£ãå¦ä¸æ¯ç±»å è½½å¨çå±æ¬¡å ³ç³»å¾ã
å¯å¨ç±»å è½½å¨ï¼BootstrapClassLoaderï¼ï¼å¨JVMè¿è¡æ¶è¢«å建ï¼è´è´£å è½½åæ¾å¨JDKå®è£ ç®å½ä¸çjre\libçç±»æ件ï¼æè 被-Xbootclasspathåæ°æå®çè·¯å¾ä¸ï¼å¹¶ä¸è½è¢«èææºè¯å«çç±»åºï¼å¦rt.jarï¼ææçjava.*å¼å¤´çç±»å被Bootstrap ClassLoaderå è½½ï¼ãå¯å¨ç±»æ æ³è¢«JAVAç¨åºç´æ¥å¼ç¨ã
æ©å±ç±»å è½½å¨ï¼Extension ClassLoaderï¼ï¼è¯¥ç±»å è½½å¨è´è´£å è½½JDKå®è£ ç®å½ä¸ç\jre\lib\extçç±»ï¼æè ç±java.ext.dirsç³»ç»åéæå®è·¯å¾ä¸çææç±»åºï¼å¼åè ä¹å¯ä»¥ç´æ¥ä½¿ç¨æ©å±ç±»å è½½å¨ã
åºç¨ç¨åºç±»å è½½å¨ï¼AppClassLoaderï¼ï¼è´è´£å è½½ç¨æ·ç±»è·¯å¾ï¼Classpathï¼ææå®çç±»ï¼å¼åè å¯ä»¥ç´æ¥ä½¿ç¨è¯¥ç±»å è½½å¨ï¼å¦æåºç¨ç¨åºä¸æ²¡æå®ä¹è¿èªå·±çç±»å è½½å¨ï¼è¯¥ç±»å è½½å¨ä¸ºé»è®¤çç±»å è½½å¨ã
ç¨æ·èªå®ä¹ç±»å è½½å¨ï¼User ClassLoaderï¼ï¼JVMèªå¸¦çç±»å è½½å¨æ¯ä»æ¬å°æ件系ç»å è½½æ åçjava classæ件ï¼èèªå®ä¹çç±»å è½½å¨å¯ä»¥åå°å¨æ§è¡é置信代ç ä¹åï¼èªå¨éªè¯æ°åç¾åï¼å¨æå°å建符åç¨æ·ç¹å®éè¦çå®å¶åæ建类ï¼ä»ç¹å®çåºæï¼æ°æ®åºãç½ç»ä¸ï¼åå¾java classã
注æå¦ä¸çç±»å è½½å¨å¹¶ä¸æ¯éè¿ç»§æ¿çæ¹å¼å®ç°çï¼èæ¯éè¿ç»åçæ¹å¼å®ç°çãèJAVAèææºçå 载模å¼æ¯ä¸ç§å§æ´¾æ¨¡å¼ï¼å¦ä¸å¾ä¸ç1-7æ¥æ示ãä¸å±çå è½½å¨è½å¤çå°ä¸å±å è½½å¨ä¸çç±»ï¼åä¹åä¸è¡ãç±»å è½½å¨å¯ä»¥å 载类ä½æ¯ä¸è½å¸è½½ç±»ã说äºä¸å¤§å ï¼è¿æ¯æè§éè¦æ¿ç¹ä»£ç 说äºã
é¦å å å®ä¹èªå·±çç±»å è½½å¨MyClassLoaderï¼ç»§æ¿èªClassLoaderï¼å¹¶è¦çäºç¶ç±»çfindClass(String name)æ¹æ³ï¼å¦ä¸ï¼
å©ç¨å®ä¹çç±»å è½½å¨å è½½æå®çåèç æ件ï¼å¦éè¿MyClassLoaderå è½½C:\\Users\\Administrator\\ä¸çTest.classåèç æ件ï¼ä»£ç å¦ä¸æ示ï¼
ï¼2ï¼è¿è¡æ¶æ°æ®åº
åèç çå 载第ä¸æ¥ï¼å ¶ååå«æ¯è®¤è¯ãåå¤ã解æãåå§åï¼é£ä¹è¿äºæ¥éª¤åå ·ä½åäºåªäºå·¥ä½ï¼å¦ä¸å¾æ示ï¼
ï¼3ï¼å¦ä¸å°ä»ç»è¿è¡æ¶æ°æ®åºï¼ä¸»è¦å为æ¹æ³åºãJavaå ãèææºæ ãæ¬å°æ¹æ³æ ãç¨åºè®¡æ°å¨ãå ¶ä¸æ¹æ³åºåJavaå ä¸æ ·ï¼æ¯å个线ç¨å ±äº«çå ååºåï¼èèææºæ ãæ¬å°æ¹æ³æ ãç¨åºè®¡æ°å¨æ¯çº¿ç¨ç§æçå ååºã
Javaå ï¼Javaå æ¯Javaèææºæ管ççå åä¸æ大çä¸åï¼è¢«è¿ç¨çææ线ç¨å ±äº«ï¼å¨èææºå¯å¨æ¶è¢«å建ã该åºåçå¯ä¸ç®çå°±æ¯åæ¾å¯¹è±¡å®ä¾ï¼å ä¹ææç对象å®ä¾é½å¨è¿éåé å åï¼éçJITç¼è¯å¨çåå±ä¸éé¸åæ¯ææ¯éæ¸æçï¼æ ä¸åé ãæ éæ¿æ¢çä¼åææ¯ä½¿å¾å¯¹è±¡å¨å ä¸çåé å ååå¾ä¸æ¯é£ä¹âç»å¯¹âãJavaå æ¯åå¾æ¶éå¨ç®¡çç主è¦åºåãç±äºç°å¨çæ¶éå¨åºæ¬é½éç¨å代æ¶éç®æ³ï¼æ以Javaå ä¸è¿å¯ä»¥å为è年代åæ°ç代(EdenãFrom SurvivorãTo Survivor)ãæ ¹æ®Javaèææºè§èï¼Javaå å¯ä»¥å¤äºç©çä¸ä¸è¿ç»çå å空é´ï¼åªè¦é»è¾ä¸è¿ç»å³å¯ã该åºåç大å°å¯ä»¥éè¿-Xmxå-Xmsåæ°æ¥æ©å±ï¼å¦æå ä¸æ²¡æå åå®æå®ä¾åé ï¼å¹¶ä¸å ä¹æ æ³æ©å±ï¼å°ä¼æåºOutOfMemoryErrorå¼å¸¸ã
æ¹æ³åºï¼ç¨äºåå¨è¢«Javaèææºå è½½ç类信æ¯ã常éãéæåéãå³æ¶ç¼è¯å¨ç¼è¯åç代ç çæ°æ®ãä¸åäºJavaå çæ¯ï¼Javaèææºè§è对æ¹æ³åºçéå¶é常宽æ¾ï¼å¯ä»¥éæ©ä¸å®ç°åå¾æ¶éãä½å¹¶éæ°æ®è¿å ¥äºæ¹æ³åºå°±âæ°¸ä¹ âåå¨äºï¼è¿åºåå ååæ¶ç®æ 主è¦æ¯é对常éæ± çåæ¶å对类åçå¸è½½ãå¦æ该åºåå åä¸è¶³ä¹ä¼æåºOutOfMemoryErrorå¼å¸¸ã
常éæ± ï¼è¿ä¸ªåè¯å¯è½å¤§å®¶ä¹ç»å¸¸è§ï¼æ¯æ¹æ³åºçä¸é¨åãClassæ件é¤äºæç±»ççæ¬ãå段ãæ¹æ³ãæ¥å£çæè¿°ä¿¡æ¯å¤ï¼è¿æä¸é¡¹ä¿¡æ¯å°±æ¯å¸¸éæ± ï¼ç¨äºåæ¾ç¼è¯æçæçåç§åé¢éå符å·å¼ç¨ãJavaèææºè¿è¡æé´ï¼ä¹å¯è½å°æ°ç常éæ¾å ¥å¸¸éæ± ï¼å¦Stringç±»çintern()æ¹æ³ï¼ã
èææºæ ï¼çº¿ç¨ç§æï¼çå½å¨æä¸çº¿ç¨ç¸åãèææºæ æè¿°çæ¯Javaæ¹æ³æ§è¡çå å模åï¼æ¯ä¸ªæ¹æ³å¨æ§è¡æ¶é½ä¼å建ä¸ä¸ªæ 帧ç¨äºåå¨å±é¨åé表ãæä½æ°æ ãå¨æé¾æ¥ãæ¹æ³åºå£çä¿¡æ¯ãæ¯ä¸ªæ¹æ³ä»è°ç¨ç´è³æ§è¡å®æçè¿ç¨ï¼å°±å¯¹åºçä¸ä¸ªæ 帧å¨èææºæ ä¸å ¥æ å°åºæ çè¿ç¨ãå¦æ请æ±çç«æ·±åº¦å¤§äºèææºæå 许ç深度ï¼å°æåºStackOverflowErrorå¼å¸¸ï¼èææºæ å¨å¨ææ©å±æ¶å¦ææ æ³ç³è¯·å°è¶³å¤çå åï¼å°±ä¼æåºOutOfMemoryErrorå¼å¸¸ã
è¿æç®åçä¸æ®µä»£ç 解éä¸ä¸ï¼ç¨åºå¨è¿è¡æ¶æ°æ®åºä¸ªé¨åçååæ åµã
ï¼4ï¼éè¿ç¼è¯å¨å°Test.javaæ件ç¼è¯ä¸ºTest.classï¼å©ç¨javap -verbose Test.class对ç¼è¯åçåèç è¿è¡åæï¼å¦ä¸å¾æ示ï¼
ï¼5ï¼ççè¿è¡æ¶æ°æ®åºçååï¼