簡體   English   中英

對於在Java中重用的對象的存儲意味着什么?

[英]What does it mean for the storage for an object to be reused in Java?

在Java語言規范的第12.6節中,它說:

Java編程語言沒有指定調用終結器的時間,除非說它將在重用對象的存儲之前發生。

存儲要重用的對象意味着什么?

我是否需要擔心在運行時隨機發生這種情況(例如:在我使用它時會覆蓋某個對象)? 如果是這樣,我該如何防止這種情況?

存儲要重用的對象意味着什么?

我是否需要擔心在運行時隨機發生這種情況(例如:在我使用它時會覆蓋某個對象)?

據我所知,Java的語義不會在任何地方暴露這種現象,因此我認為它並不意味着什么,它是一個實現細節,或者是一個“信息性”評論。

換句話說,這句話:

except to say that it will happen before the storage for the object is reused.

等同於什么都不說,因為它對如何實現符合標准的Java編譯器沒有任何影響。

在對象被垃圾收集之后重用對象的存儲,並且用於存儲該對象的存儲器被用於其他事物。

由於這只發生在對象被垃圾收集之后,它永遠不會發生在您仍在使用的對象上。

我認為“存儲”是指用於存儲對象的物理堆空間。 因此,根據規范,終結器方法可以保證在它所屬的對象尚未被覆蓋的情況下運行。

如果你正在使用一個對象(即對它有一個正常的引用),它根本沒有資格進行垃圾收集,所以你不必擔心它。

將Java“堆”存儲視為一堆黑板(或“黑板”或“白板”或其他任何東西,具體取決於您的年齡和您的籌集地點)。

當您創建一個對象時,您“聲明”其中一個黑板供您使用,並將對象的數據寫入其中。 為了跟蹤它,你將一根繩子貼在它的角落,然后把那根繩子拿在手里。 你手里拿着那條繩子作為“參考”。

然后,您可以創建第二個對象(聲稱使用不同的黑板),在其上寫下名稱,並將第一個字符串的末尾粘貼到該名稱旁邊的第二個黑板上。 該名稱是對象中的一個字段,它引用您創建的第一個對象。

只要你有一根繩子,你可以從一個黑板跟隨到下一個黑板,到達你仍然使用的最遙遠的黑板,你就可以讀到你在那個遙遠的黑板上寫的東西。

如果您不再需要其中一個黑板,請將它與您的手之間或其他黑板上的任何地方的繩子移除,您可能已將其粘貼。 (這是將引用設置為null。)

當黑板不再有任何字符串通向它時,它可以被看門人刪除並提供給需要黑板的​​其他人。 當他這樣做的時候,他會將那些從黑板上移開的琴弦移到任何其他地方,如果沒有其他琴弦到達它們,它們也會被刪除。 (他還會仔細地弄清楚,例如,是否有兩個相互連接的黑板,沒有其他字符串到達​​它們。這些也將被刪除。)

“終結器”是一張可以粘貼到黑板一側的說明書。 在看門人擦除黑板之前,他將閱讀該表上的說明並執行所請求的任何操作。

我是否需要擔心在運行時隨機發生這種情況(例如:在我使用它時會覆蓋某個對象)?

不,你沒有。

簡單來說,對象將僅在GC知道有你(純Java)應用程序可以以后再使用它們沒有可能的方式覆蓋。


細節:

對象的存儲僅在垃圾收集和完成后重復使用。 並且只有在對所有可到達的引用丟失/覆蓋/遺忘之后,對象才會被垃圾收集。 如果對象沒有可訪問的引用,則應用程序無法使用它: - 它不再知道該對象。

事實上,它有點復雜,因為可達性有不同的“陰影”。 例如,等待最終確定的對象是“幻像可達”,並且終結器可以再次“復活”該對象。 但除非你正在編寫覆蓋finalize()類,否則你不需要知道這一點。 要記住的是,只有無法訪問的對象才能回收其存儲,並且純Java程序無法查看無法訪問的對象的狀態是不可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM