å æ¯å ï¼heapï¼ï¼æ æ¯æ ï¼stackï¼ï¼å æ æ¯æ ã
æ ä¸åé çæ¯åºæ¬ç±»ååèªå®ä¹å¯¹è±¡çå¼ç¨ã
å ä¸åé çæ¯å¯¹è±¡ï¼ä¹å°±æ¯newåºæ¥çä¸è¥¿ã 被ææ线ç¨å ±äº«ã
æ¹æ³åº/éæåº åæ¾çæ¯ç±»ä¿¡æ¯åstaticåéã常éã 被ææ线ç¨å ±äº«ã
ä¹å¯ä»¥è¿ä¹ç解ï¼å æ¯ç¨æ¥åæ¾å¯¹è±¡çï¼æ æ¯ç¨æ¥è¿è¡ç¨åºçã
å ï¼javaçåå¾åæ¶å¨ä¼èªå¨çåæ¶è¿äºä¸ç¨çæ°æ®ã缺ç¹æ¯ç±äºè¦å¨æçåé å åï¼åå¨æçä¼æ¯è¾çæ ¢ã
æ ï¼æ çä¼å¿æ¯ååæçæ¯è¾å¿«ï¼ä» 次äºå¯åå¨ï¼æ æ°æ®å¯ä»¥å ±äº«ãä½ç¼ºç¹æ¯æ ä¸çæ°æ®å¤§å°åçåæçåºå®çï¼ç¼ºä¹çµæ´»æ§ã
ä¸è¬æ¯ä¸ªæ¹æ³çè°ç¨é½ä¼ç¬ç«æä¸ä¸ªæ æ¥ä¿å对象çå¼ç¨åéï¼å¨æ¹æ³è¿ååï¼æ ä¼æ¸ 空ï¼å½å¨ä¸æ®µä»£ç åå®ä¹ä¸ä¸ªåéæ¶ï¼Javaå°±å¨æ ä¸ä¸ºè¿ä¸ªåéåé å å空é´ï¼å½è¶ è¿åéçä½ç¨ååï¼Javaä¼èªå¨éæ¾æ为该åéæåé çå å空é´ï¼è¯¥å å空é´å¯ä»¥ç«å³è¢«å¦ä½ä»ç¨ã
JAVAçJVMçå åå¯å为3个åºï¼å (heap)ãæ (stack)åæ¹æ³åº(method)
æ åº:
æ¯ä¸ªçº¿ç¨å å«ä¸ä¸ªæ åºï¼æ ä¸åªä¿åæ¹æ³ä¸ï¼ä¸å æ¬å¯¹è±¡çæååéï¼çåºç¡æ°æ®ç±»ååèªå®ä¹å¯¹è±¡çå¼ç¨(ä¸æ¯å¯¹è±¡)ï¼å¯¹è±¡é½åæ¾å¨å åºä¸
æ¯ä¸ªæ ä¸çæ°æ®(åå§ç±»åå对象å¼ç¨)é½æ¯ç§æçï¼å ¶ä»æ ä¸è½è®¿é®ã
æ å为3个é¨åï¼åºæ¬ç±»ååéåºãæ§è¡ç¯å¢ä¸ä¸æãæä½æ令åº(åæ¾æä½æ令)ã
å åº:
åå¨çå ¨é¨æ¯å¯¹è±¡å®ä¾ï¼æ¯ä¸ªå¯¹è±¡é½å å«ä¸ä¸ªä¸ä¹å¯¹åºçclassçä¿¡æ¯(classä¿¡æ¯åæ¾å¨æ¹æ³åº)ã
jvmåªæä¸ä¸ªå åº(heap)被ææ线ç¨å ±äº«ï¼å ä¸ä¸åæ¾åºæ¬ç±»åå对象å¼ç¨ï¼åªåæ¾å¯¹è±¡æ¬èº«ï¼å ä¹ææç对象å®ä¾åæ°ç»é½å¨å ä¸åé ã
æ¹æ³åº:
åå«éæåºï¼è·å ä¸æ ·ï¼è¢«ææç线ç¨å ±äº«ãå®ç¨äºåå¨å·²ç»è¢«èææºå è½½ç类信æ¯ã常éãéæåéãå³æ¶ç¼è¯å¨ç¼è¯åç代ç çæ°æ®ã
è¿ä¸ªâå â并ä¸æ¯æ°æ®ç»ææä¹ä¸çå ï¼Heap (data structure)ï¼ä¸ç§æåºçæ ï¼ï¼èæ¯å¨æå ååé æä¹ä¸çå ââç¨äºç®¡çå¨æçå½å¨æçå ååºåã
JVMè§è让æ¯ä¸ªJava线ç¨æ¥æèªå·±çç¬ç«çJVMæ ï¼ä¹å°±æ¯Javaæ¹æ³çè°ç¨æ ã
JVMè§è为äºå 许native代ç å¯ä»¥è°ç¨Java代ç ï¼ä»¥åå 许Java代ç è°ç¨nativeæ¹æ³ï¼è¿è§å®æ¯ä¸ªJava线ç¨æ¥æèªå·±çç¬ç«çnativeæ¹æ³æ ã
并ä¸æ¯è¯´å ·ä½çJVMå®ç°ççè¦ç»æ¯ä¸ªJava线ç¨å¼ä¸¤ä¸ªç¬ç«çæ ã以Oracle JDK / OpenJDKçHotSpot VM为ä¾ï¼å®ä½¿ç¨æè°çâmixed stackâââå¨åä¸ä¸ªè°ç¨æ éåæ¾Javaæ¹æ³çæ 帧ä¸nativeæ¹æ³çæ 帧ï¼æ以æ¯ä¸ªJava线ç¨å ¶å®åªæä¸ä¸ªè°ç¨æ ï¼èåäºJVMè§èçJVMæ ä¸nativeæ¹æ³æ è¿ä¿©æ¦å¿µã
JVMçå 被åä¸ä¸ªJVMå®ä¾ä¸çææJava线ç¨å ±äº«ãå®é常ç±æç§èªå¨å å管çæºå¶æ管çï¼è¿ç§æºå¶é常å«åâåå¾åæ¶âï¼garbage collectionï¼GCï¼ãJVMè§è并ä¸å¼ºå¶è¦æ±JVMå®ç°éç¨åªç§GCç®æ³ã
linux ä¸ä¸ä¸ªè¿ç¨çèæå ååå¸ï¼
以32ä½å°åæä½ç³»ç»ä¸ºä¾ï¼ä¸ä¸ªè¿ç¨å¯æ¥æçèæå åå°åèå´ä¸º0-2^32ãå为两é¨åï¼ä¸é¨åçç»kernel使ç¨(kernel virtual memory)ï¼å©ä¸çæ¯è¿ç¨æ¬èº«ä½¿ç¨ï¼ å³å¾ä¸çprocess virtual memoryã
ä¸ä¸ªç¨åºæ¬è´¨ä¸é½æ¯ç± bss段ãdata段ãtext段ä¸ä¸ªç»æç
bss段ï¼Block Started by Symbol segmentï¼é常æ¯æç¨æ¥åæ¾ç¨åºä¸æªåå§åçå ¨å±åéçä¸åå ååºåï¼ä¸è¬å¨åå§åæ¶bss 段é¨åå°ä¼æ¸ é¶ãbss段å±äºéæå ååé ï¼å³ç¨åºä¸å¼å§å°±å°å ¶æ¸ é¶äºã
å¨Cè¯è¨ä¹ç±»çç¨åºç¼è¯å®æä¹åï¼å·²åå§åçå ¨å±åéä¿åå¨.data 段ä¸ï¼æªåå§åçå ¨å±åéä¿åå¨.bss 段ä¸ã
textådata段é½å¨å¯æ§è¡æ件ä¸ï¼å¨åµå ¥å¼ç³»ç»éä¸è¬æ¯åºåå¨éåæ件ä¸ï¼ï¼ç±ç³»ç»ä»å¯æ§è¡æ件ä¸å è½½ï¼èbss段ä¸å¨å¯æ§è¡æ件ä¸ï¼ç±ç³»ç»åå§åã