stackjava
A. java涓鐨勫爢鏍堥棶棰橈紵
鍏跺疄榪欎簺鍩虹鐨勪笢瑗跨綉涓婃湁涓嶅皯, 浣犲彲浠ュ氬幓csdn,閭i噷鍙浠ュ﹀埌涓嶅皯濂戒笢瑗 ,鎴戝氨鐩存帴緇欎綘綺樿創榪囨潵浜
java涓鍫嗘爤(stack)鍜屽爢(heap)
涓銆佸爢鏍(stack)鍜屽爢(heap)錛
錛1錛夊唴瀛樺垎閰嶇殑絳栫暐
銆銆鎸夌収緙栬瘧鍘熺悊鐨勮傜偣,紼嬪簭榪愯屾椂鐨勫唴瀛樺垎閰嶆湁涓夌嶇瓥鐣,鍒嗗埆鏄闈欐佺殑,鏍堝紡鐨,鍜屽爢寮忕殑.
銆闈欐佸瓨鍌ㄥ垎閰嶆槸鎸囧湪緙栬瘧鏃跺氨鑳界『瀹氭瘡涓鏁版嵁鐩鏍囧湪榪愯屾椂鍒葷殑瀛樺偍絀洪棿闇奼,鍥犺屽湪緙栬瘧鏃跺氨鍙浠ョ粰浠栦滑鍒嗛厤鍥哄畾鐨勫唴瀛樼┖闂.榪欑嶅垎閰嶇瓥鐣ヨ佹眰紼嬪簭浠g爜涓涓嶅厑璁告湁鍙鍙樻暟鎹緇撴瀯(姣斿傚彲鍙樻暟緇)鐨勫瓨鍦,涔熶笉鍏佽告湁宓屽楁垨鑰呴掑綊鐨勭粨鏋勫嚭鐜,鍥犱負瀹冧滑閮戒細瀵艱嚧緙栬瘧紼嬪簭鏃犳硶璁$畻鍑嗙『鐨勫瓨鍌ㄧ┖闂撮渶奼.
銆鏍堝紡瀛樺偍鍒嗛厤涔熷彲縐頒負鍔ㄦ佸瓨鍌ㄥ垎閰,鏄鐢變竴涓綾諱技浜庡爢鏍堢殑榪愯屾爤鏉ュ疄鐜扮殑.鍜岄潤鎬佸瓨鍌ㄥ垎閰嶇浉鍙,鍦ㄦ爤寮忓瓨鍌ㄦ柟妗堜腑,紼嬪簭瀵規暟鎹鍖虹殑闇奼傚湪緙栬瘧鏃舵槸瀹屽叏鏈鐭ョ殑,鍙鏈夊埌榪愯岀殑鏃跺欐墠鑳藉熺煡閬,浣嗘槸瑙勫畾鍦ㄨ繍琛屼腑榪涘叆涓涓紼嬪簭妯″潡鏃,蹇呴』鐭ラ亾璇ョ▼搴忔ā鍧楁墍闇鐨勬暟鎹鍖哄ぇ灝忔墠鑳藉熶負鍏跺垎閰嶅唴瀛.鍜屾垜浠鍦ㄦ暟鎹緇撴瀯鎵鐔熺煡鐨勬爤涓鏍,鏍堝紡瀛樺偍鍒嗛厤鎸夌収鍏堣繘鍚庡嚭鐨勫師鍒欒繘琛屽垎閰嶃
銆闈欐佸瓨鍌ㄥ垎閰嶈佹眰鍦ㄧ紪璇戞椂鑳界煡閬撴墍鏈夊彉閲忕殑瀛樺偍瑕佹眰,鏍堝紡瀛樺偍鍒嗛厤瑕佹眰鍦ㄨ繃紼嬬殑鍏ュ彛澶勫繀欏葷煡閬撴墍鏈夌殑瀛樺偍瑕佹眰,鑰屽爢寮忓瓨鍌ㄥ垎閰嶅垯涓撻棬璐熻矗鍦ㄧ紪璇戞椂鎴栬繍琛屾椂妯″潡鍏ュ彛澶勯兘鏃犳硶紜瀹氬瓨鍌ㄨ佹眰鐨勬暟鎹緇撴瀯鐨勫唴瀛樺垎閰,姣斿傚彲鍙橀暱搴︿覆鍜屽硅薄瀹炰緥.鍫嗙敱澶х墖鐨勫彲鍒╃敤鍧楁垨絀洪棽鍧楃粍鎴,鍫嗕腑鐨勫唴瀛樺彲浠ユ寜鐓т換鎰忛『搴忓垎閰嶅拰閲婃斁.
錛2錛夊爢鍜屾爤鐨勬瘮杈
銆銆涓婇潰鐨勫畾涔変粠緙栬瘧鍘熺悊鐨勬暀鏉愪腑鎬葷粨鑰屾潵,闄ら潤鎬佸瓨鍌ㄥ垎閰嶄箣澶,閮芥樉寰楀緢鍛嗘澘鍜岄毦浠ョ悊瑙,涓嬮潰鎾囧紑闈欐佸瓨鍌ㄥ垎閰,闆嗕腑姣旇緝鍫嗗拰鏍:
銆浠庡爢鍜屾爤鐨勫姛鑳藉拰浣滅敤鏉ラ氫織鐨勬瘮杈,鍫嗕富瑕佺敤鏉ュ瓨鏀懼硅薄鐨勶紝鏍堜富瑕佹槸鐢ㄦ潵鎵ц岀▼搴忕殑.鑰岃繖縐嶄笉鍚屽張涓昏佹槸鐢變簬鍫嗗拰鏍堢殑鐗圭偣鍐沖畾鐨:
銆鍦ㄧ紪紼嬩腑錛屼緥濡侰/C++涓錛屾墍鏈夌殑鏂規硶璋冪敤閮芥槸閫氳繃鏍堟潵榪涜岀殑,鎵鏈夌殑灞閮ㄥ彉閲,褰㈠紡鍙傛暟閮芥槸浠庢爤涓鍒嗛厤鍐呭瓨絀洪棿鐨勩傚疄闄呬笂涔熶笉鏄浠涔堝垎閰,鍙鏄浠庢爤欏跺悜涓婄敤灝辮,灝卞ソ鍍忓伐鍘備腑鐨勪紶閫佸甫(conveyor belt)涓鏍,Stack Pointer浼氳嚜鍔ㄦ寚寮曚綘鍒版斁涓滆タ鐨勪綅緗,浣犳墍瑕佸仛鐨勫彧鏄鎶婁笢瑗挎斁涓嬫潵灝辮.閫鍑哄嚱鏁扮殑鏃跺欙紝淇鏀規爤鎸囬拡灝卞彲浠ユ妸鏍堜腑鐨勫唴瀹歸攢姣.榪欐牱鐨勬ā寮忛熷害鏈蹇,褰撶劧瑕佺敤鏉ヨ繍琛岀▼搴忎簡.闇瑕佹敞鎰忕殑鏄,鍦ㄥ垎閰嶇殑鏃跺,姣斿備負涓涓鍗沖皢瑕佽皟鐢ㄧ殑紼嬪簭妯″潡鍒嗛厤鏁版嵁鍖烘椂,搴斾簨鍏堢煡閬撹繖涓鏁版嵁鍖虹殑澶у皬,涔熷氨璇存槸鉶界劧鍒嗛厤鏄鍦ㄧ▼搴忚繍琛屾椂榪涜岀殑,浣嗘槸鍒嗛厤鐨勫ぇ灝忓氬皯鏄紜瀹氱殑,涓嶅彉鐨,鑰岃繖涓"澶у皬澶氬皯"鏄鍦ㄧ紪璇戞椂紜瀹氱殑,涓嶆槸鍦ㄨ繍琛屾椂.
銆 鍫嗘槸搴旂敤紼嬪簭鍦ㄨ繍琛岀殑鏃跺欒鋒眰鎿嶄綔緋葷粺鍒嗛厤緇欒嚜宸卞唴瀛橈紝鐢變簬浠庢搷浣滅郴緇熺$悊鐨勫唴瀛樺垎閰,鎵浠ュ湪鍒嗛厤鍜岄攢姣佹椂閮借佸崰鐢ㄦ椂闂達紝鍥犳ょ敤鍫嗙殑鏁堢巼闈炲父浣.浣嗘槸鍫嗙殑浼樼偣鍦ㄤ簬,緙栬瘧鍣ㄤ笉蹇呯煡閬撹佷粠鍫嗛噷鍒嗛厤澶氬皯瀛樺偍絀洪棿錛屼篃涓嶅繀鐭ラ亾瀛樺偍鐨勬暟鎹瑕佸湪鍫嗛噷鍋滅暀澶氶暱鐨勬椂闂,鍥犳,鐢ㄥ爢淇濆瓨鏁版嵁鏃朵細寰楀埌鏇村ぇ鐨勭伒媧繪с備簨瀹炰笂,闈㈠悜瀵硅薄鐨勫氭佹,鍫嗗唴瀛樺垎閰嶆槸蹇呬笉鍙灝戠殑,鍥犱負澶氭佸彉閲忔墍闇鐨勫瓨鍌ㄧ┖闂村彧鏈夊湪榪愯屾椂鍒涘緩浜嗗硅薄涔嬪悗鎵嶈兘紜瀹.鍦–++涓錛岃佹眰鍒涘緩涓涓瀵硅薄鏃訛紝鍙闇鐢╪ew鍛戒護緙栧埗鐩稿叧鐨勪唬鐮佸嵆鍙銆傛墽琛岃繖浜涗唬鐮佹椂錛屼細鍦ㄥ爢閲岃嚜鍔ㄨ繘琛屾暟鎹鐨勪繚瀛.褰撶劧錛屼負杈懼埌榪欑嶇伒媧繪э紝蹇呯劧浼氫粯鍑轟竴瀹氱殑浠d環:鍦ㄥ爢閲屽垎閰嶅瓨鍌ㄧ┖闂存椂浼氳姳鎺夋洿闀跨殑鏃墮棿錛佽繖涔熸f槸瀵艱嚧鎴戜滑鍒氭墠鎵璇寸殑鏁堢巼浣庣殑鍘熷洜,鐪嬫潵鍒楀畞鍚屽織璇寸殑濂,浜虹殑浼樼偣寰寰涔熸槸浜虹殑緙虹偣,浜虹殑緙虹偣寰寰涔熸槸浜虹殑浼樼偣(鏅晘).
錛3錛塉VM涓鐨勫爢鍜屾爤
銆銆JVM鏄鍩轟簬鍫嗘爤鐨勮櫄鎷熸満.JVM涓烘瘡涓鏂板壋寤虹殑綰跨▼閮藉垎閰嶄竴涓鍫嗘爤.涔熷氨鏄璇,瀵逛簬涓涓狫ava紼嬪簭鏉ヨ達紝瀹冪殑榪愯屽氨鏄閫氳繃瀵瑰爢鏍堢殑鎿嶄綔鏉ュ畬鎴愮殑銆傚爢鏍堜互甯т負鍗曚綅淇濆瓨綰跨▼鐨勭姸鎬併侸VM瀵瑰爢鏍堝彧榪涜屼袱縐嶆搷浣:浠ュ撫涓哄崟浣嶇殑鍘嬫爤鍜屽嚭鏍堟搷浣溿
銆銆 鎴戜滑鐭ラ亾,鏌愪釜綰跨▼姝e湪鎵ц岀殑鏂規硶縐頒負姝ょ嚎紼嬬殑褰撳墠鏂規硶.鎴戜滑鍙鑳戒笉鐭ラ亾,褰撳墠鏂規硶浣跨敤鐨勫撫縐頒負褰撳墠甯с傚綋綰跨▼嬋媧諱竴涓狫ava鏂規硶,JVM灝變細鍦ㄧ嚎紼嬬殑Java鍫嗘爤閲屾柊鍘嬪叆涓涓甯с傝繖涓甯ц嚜鐒舵垚涓轟簡褰撳墠甯.鍦ㄦゆ柟娉曟墽琛屾湡闂,榪欎釜甯у皢鐢ㄦ潵淇濆瓨鍙傛暟,灞閮ㄥ彉閲,涓闂磋$畻榪囩▼鍜屽叾浠栨暟鎹.榪欎釜甯у湪榪欓噷鍜岀紪璇戝師鐞嗕腑鐨勬椿鍔ㄧ邯褰曠殑姒傚康鏄宸涓嶅氱殑.
銆銆 浠嶫ava鐨勮繖縐嶅垎閰嶆満鍒舵潵鐪,鍫嗘爤鍙堝彲浠ヨ繖鏍風悊瑙:鍫嗘爤(Stack)鏄鎿嶄綔緋葷粺鍦ㄥ緩絝嬫煇涓榪涚▼鏃舵垨鑰呯嚎紼(鍦ㄦ敮鎸佸氱嚎紼嬬殑鎿嶄綔緋葷粺涓鏄綰跨▼)涓鴻繖涓綰跨▼寤虹珛鐨勫瓨鍌ㄥ尯鍩燂紝璇ュ尯鍩熷叿鏈夊厛榪涘悗鍑虹殑鐗規с
銆 姣忎竴涓狫ava搴旂敤閮藉敮涓瀵瑰簲涓涓狫VM瀹炰緥錛屾瘡涓涓瀹炰緥鍞涓瀵瑰簲涓涓鍫嗐傚簲鐢ㄧ▼搴忓湪榪愯屼腑鎵鍒涘緩鐨勬墍鏈夌被瀹炰緥鎴栨暟緇勯兘鏀懼湪榪欎釜鍫嗕腑,騫剁敱搴旂敤鎵鏈夌殑綰跨▼鍏變韓.璺烠/C++涓嶅悓錛孞ava涓鍒嗛厤鍫嗗唴瀛樻槸鑷鍔ㄥ垵濮嬪寲鐨勩侸ava涓鎵鏈夊硅薄鐨勫瓨鍌ㄧ┖闂撮兘鏄鍦ㄥ爢涓鍒嗛厤鐨勶紝浣嗘槸榪欎釜瀵硅薄鐨勫紩鐢ㄥ嵈鏄鍦ㄥ爢鏍堜腑鍒嗛厤,涔熷氨鏄璇村湪寤虹珛涓涓瀵硅薄鏃朵粠涓や釜鍦版柟閮藉垎閰嶅唴瀛橈紝鍦ㄥ爢涓鍒嗛厤鐨勫唴瀛樺疄闄呭緩絝嬭繖涓瀵硅薄錛岃屽湪鍫嗘爤涓鍒嗛厤鐨勫唴瀛樺彧鏄涓涓鎸囧悜榪欎釜鍫嗗硅薄鐨勬寚閽(寮曠敤)鑰屽凡銆
B. java堆棧是什麼意思
簡單的說:Java把內存劃分成兩種:一種是棧內存,一種是堆內存。x0dx0a x0dx0a在函數中定義的一些基本類型的變數和對象的引用變數都在函數的棧內存中分配。當在一段代碼塊定義一個變數時,Java就在棧中為這個變數分配內存空間,當超過變數的作用域後,Java會自動釋放友衡掉為該變數所分配的內存空間,該內存空間可以立即被另作他用。x0dx0a x0dx0a堆內存用來存放由new創建的對象和數好掘做組。在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。在堆散雀中產生了一個數組或對象後,還可以在棧中定義一個特殊的變數,讓棧中這個變數的取值等於數組或對象在堆內存中的首地址,棧中的這個變數就成了數組或對象的引用變數。引用變數就相當於是為數組或對象起的一個名稱,以後就可以在程序中使用棧中的引用變數來訪問堆中的數組或對象