① Java方法內創建對象實例後,什麼時候釋放內存(引
一般情況下,當JVM發現堆內存比較緊張、不太夠用時,它就會著手進行垃圾回收工作(也就是你說的釋放內存,同時有一個前提,GC的前提是這個對象已經「死了」,也就是長時間沒有使用,並且沒有被全局變數,如map等所引用)。但是你要認清這樣一個殘酷的事實:JVM進行GC的時間點是無法精確預知的。因為GC啟動的時刻會受到各種運行環境因素的影響,隨機性太大。
② Java 屬性 方法 堆 棧
你區分的原則有問題,所以想不明白,堆和棧里是可以共存的,只是分工不同
首先棧是不長期保存數據的,方法調用到時壓棧,調用完了就彈出(也就是說釋放了)了,但是棧里只有引用,沒有對象;對象都在堆里,當沒人再引用它時等著釋放
回到你這個題,答案是111和3的對象都在堆里,而引用在方法執行時被壓在棧里,方法執行完就釋放了
A是局部變數,在棧里,所以a的引用在method_1執行後一定會被釋放
b是類變數,由於被class A的對象引用,是否被釋放取決於class A的對象是否能被回收
③ java中方法聲明的變數在方法返回後會被清除,那無返回值的方法什麼時候清除內存棧的變數
我一開始猜測吧,會不會void方法會像這樣隱式地使用return;
咳,那我也不知道了,但是我猜測啊,java肯定能知道一個函數的生命周期何時結束(可能是運行到函數的結尾大括弧?),一個函數生命周期結束後,其中的局部變數生命周期也隨之結束,這些變數失去所有引用,那麼下次gc的時候就會把它們從棧里清除了。
gc的觸發時機由jvm自行控制,所以清除時間是不確定的。
但是可以確定的是,下次gc執行回收時,它們也就玩完了。
④ java gc只負責堆的內存,那棧的內存是怎麼釋放
棧內存會在對應線程結束時候自動釋放啊
⑤ java中堆與棧的區別
棧是臨時存儲空間,用於存放變數等;堆則是真正的系統空間,用於存放新創建的對象。
⑥ java棧內存中創建的引用所佔用的內存什麼時候釋放
運行完method1()方法後。str引用內存釋放!
⑦ Java棧和本地方法棧方法調用棧,這些都是什麼
JAVA內存裡面有一般有四個分類,堆, 棧(堆棧), 靜態域, 常量池
棧: 實際上是一個隊列, 遵循 FILO的原則(後進先出), 裡面儲存的是函數的參數值,局部變數,對象的引用(對象本身不在這里)等,因此在每調用一個函數時,堆棧都會分配一部分空間給它,函數返回時,被釋放
堆: 儲存靜態變數,全局變數 和 用new創建的東西,棧中的內存是動態內存,其中的內存在不使用時隨時可以被回收
靜態域:存放對象中static定義的成員
常量池:存放常量
根據以上解釋回答你的問題:
JAVA棧存的是函數的參數值,局部變數,對象的引用
方法調用棧? 沒有這說法吧, 方法的調用是存在棧中的
本地方法棧, 和JAVA中的棧一個作用, 只是這個棧是屬於本地的,不屬於JAVA虛擬機,但受JAVA虛擬機的控制,因為是JAVA虛擬機簡單地動態鏈接並直接調用指定的本地方法。可以把這看作是虛擬機利用本地方法來動態擴展自己
局部變數和對象引用存在 棧 中, 方法調用的棧幀也是在 棧 中
以上是我自己查資料+自己的理解,有錯望指出
⑧ java中靜態方法區的資源什麼時間被釋放
class裡面的靜態方法是在這個class被釋放的時候同時釋放。
那麼,class是什麼時候釋放的呢?
在sun 的JDK中所有的class都有它的ClassLoader,當這個ClassLoader被釋放時,所有被它裝載的class也同時被釋放。
⑨ 如何理解Java虛擬機棧
堆是堆(heap),棧是棧(stack),堆棧是棧。
棧中分配的是基本類型和自定義對象的引用。
堆中分配的是對象,也就是new出來的東西。 被所有線程共享。
方法區/靜態區 存放的是類信息和static變數、常量。 被所有線程共享。
也可以這么理解:堆是用來存放對象的,棧是用來運行程序的。
堆:java的垃圾回收器會自動的回收這些不用的數據。缺點是由於要動態的分配內存,存儲效率會比較的慢。
棧:棧的優勢是存取效率比較快,僅次於寄存器,棧數據可以共享。但缺點是棧中的數據大小和生存期的固定的,缺乏靈活性。
一般每個方法的調用都會獨立有一個棧來保存對象的引用變數,在方法返回後,棧會清空,當在一段代碼塊定義一個變數時,Java就在棧中為這個變數分配內存空間,當超過變數的作用域後,Java會自動釋放掉為該變數所分配的內存空間,該內存空間可以立即被另作他用。
以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段不在可執行文件中,由系統初始化。
⑩ java中堆內存如何釋放
java把內存分成兩種,一種叫做棧內存,一種叫做堆內存
在函數中定義的一些基本類型的變數和對象的引用變數都是在函數的棧內存中分配。當在一段代碼塊中定義一個變數時,java就在棧中為這個變數分配內存空間,當超過變數的作用域後,java會自動釋放掉為改變數分配的內存空間,該內存空間可以立刻被另作他用。
堆內存用於存放由new創建的對象和數組。在堆中分配的內存,由java虛擬機自動垃圾回收器來管理。在堆中產生了一個數組或者對象後,還可以在
棧中定義一個特殊的變數,這個變數的取值等於數組或者對象在堆內存中的首地址,在棧中的這個特殊的變數就變成了數組或者對象的引用變數,以後就可以在程序
中使用棧內存中的引用變數來訪問堆中的數組或者對象,引用變數相當於為數組或者對象起的一個別名,或者代號。
引用變數是普通變數,定義時在棧中分配內存,引用變數在程序運行到作用域外釋放。而數組&對象本身在堆中分配,即使程序運行到使用new產生數組
和對象的語句所在地代碼塊之外,數組和對象本身佔用的堆內存也不會被釋放,數組和對象在沒有引用變數指向它的時候,才變成垃圾,不能再被使用,但是仍然占
著內存,在隨後的一個不確定的時間被垃圾回收器釋放掉。這個也是java比較占內存的主要原因。但是在寫程序的時候,可以人為的控制。