更新時間:2020-08-26 10:05:26 來源:動力節(jié)點 瀏覽1663次
大家都知道,Java中有堆、棧和方法區(qū),那它們之間有什么關系呢?小編就給Java堆棧方法區(qū)做了一個簡單分析。

基礎數(shù)據(jù)類型直接在??臻g分配, 方法的形式參數(shù),直接在棧空間分配,當方法調用完成后從??臻g回收。 引用數(shù)據(jù)類型,需要用new來創(chuàng)建,既在??臻g分配一個地址空間,又在堆空間分配對象的類變量 。 方法的引用參數(shù),在??臻g分配一個地址空間,并指向堆空間的對象區(qū),當方法調用完成后從棧空間回收。
局部變量 new 出來時,在??臻g和堆空間中分配空間,當局部變量生命周期結束后,??臻g立刻被回收,堆空間區(qū)域等待GC回收。 方法調用時傳入的 literal 參數(shù),先在??臻g分配,在方法調用完成后從??臻g分配。字符串常量在 DATA 區(qū)域分配 ,this 在堆空間分配 。數(shù)組既在??臻g分配數(shù)組名稱, 又在堆空間分配數(shù)組實際的大小!
哦 對了,補充一下static在DATA區(qū)域分配。
從Java的這種分配機制來看,堆棧又可以這樣理解:堆棧(Stack)是操作系統(tǒng)在建立某個進程時或者線程(在支持多線程的操作系統(tǒng)中是線程)為這個線程建立的存儲區(qū)域,該區(qū)域具有先進后出的特性。
每一個Java應用都唯一對應一個JVM實例,每一個實例唯一對應一個堆。應用程序在運行中所創(chuàng)建的所有類實例或數(shù)組都放在這個堆中,并由應用所有的線程共享.跟C/C++不同,Java中分配堆內存是自動初始化的。Java中所有對象的存儲空間都是在堆中分配的,但是這個對象的引用卻是在堆棧中分配,也就是說在建立一個對象時從兩個地方都分配內存,在堆中分配的內存實際建立這個對象,而在堆棧中分配的內存只是一個指向這個堆對象的指針(引用)而已。

大家對Java堆棧方法區(qū)了解了嗎?如果還有不懂的地方,可以在動力節(jié)點官網(wǎng)技術文檔中查閱相關資料。