本文目錄一覽:
java 內存回收不了什麼原因
垃圾回收(garbagecollection,簡稱GC)可以自動清空堆中不再使用的對象。垃圾回收機制最早出現於1959年,被用於解決Lisp語言中的問題。垃圾回收是Java的一大特徵。並不是所有的語言都有垃圾回收功能。比如在C/C++中,並沒有垃圾回收的機制。程序員需要手動釋放堆中的內存。由於不需要手動釋放內存,程序員在編程中也可以減少犯錯的機會。利用垃圾回收,程序員可以避免一些指針和內存泄露相關的bug(這一類bug通常很隱蔽)。但另一方面,垃圾回收需要耗費的計算時間。垃圾回收實際上是將原本屬於程序員的責任轉移給計算機。使用垃圾回收的程序需要更長的運行時間。在Java中,對象的是通過引用使用的(把對象相像成致命的毒物,引用就像是用於提取毒物的鑷子)。如果不再有引用指向對象,那麼程序員就再也無從調用或者處理該對象。這樣的對象將不可到達(unreachable)。垃圾回收用於釋放不可到達對象所佔據的內存。這是垃圾回收的基本原則。(不可到達對象是死對象,是垃圾回收所要回收的垃圾)早期的垃圾回收採用引用計數(referencecounting)的機制。每個對象包含一個計數器。當有新的指向該對象的引用時,計數器加1。當引用移除時,計數器減1。當計數器為0時,認為該對象可以進行垃圾回收。然而,一個可能的問題是,如果有兩個對象循環引用(cyclicreference),比如兩個對象互相引用,而且此時沒有其它(指向A或者指向B)的引用,程序員實際上根本無法通過引用到達這兩個對象。因此,程序員以棧和static數據為根(root),從根出發,跟隨所有的引用,就可以找到所有的可到達對象。也就是說,一個可到達對象,一定被根引用,或者被其他可到達對象引用。
java的內存回收既可以由系統完成也可以由程序員完成嗎?
程序員對於GC只有建議權沒有執行權,所以java的內存回收只能由系統完成。
java關於內存回收的說明
什麼意思?這四個全部是錯的。在Java中:
a. 程序員不需要創建線程來釋放內存。b. 程序員也不需要負責釋放無用內存。c. 也不允許程序員直接釋放內存。d. 不一定在什麼時刻執行垃圾回收。
總的來說,垃圾回收機制就是由JVM自動執行的,由JVM決定何時執行的 過程。程序員只能決定一個類在回收時所要做的動作(通過重載Object類的finalize()方法),以及提交JVM觸發垃圾回收(通過System.gc(),但不保證會執行垃圾回收)。
java垃圾回收是什麼?
垃圾回收叫做GC:garbage collection,是java虛擬機JVM提供的一種內存回收方式。開發者在使用java開發的時候不需要像使用C/C++一樣去手動釋放內存,虛擬機會通過自動檢測的方式,去釋放內存。比如你用java new了一個對象,這個時候你得到了一個強引用,strong reference。當你不在需要這個對象的時候,你只需要把它設置成null。這個時候JVM並不會立刻回收掉這塊內存,在之後的某個時間點,當JVM檢測內存的時候發現這塊內存已經沒有任何強引用了,就會把它釋放掉。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/306287.html