簡體   English   中英

與Garbage Collector和finalize()方法相關的問題

[英]Questions related to Garbage Collector and finalize() method

我正在閱讀Java的垃圾收集和finalize()方法,並且有一些疑點引起了我的注意。 對不起,如果你認為這些疑惑真的很傻。

  1. 我正在閱讀文章http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html 在這一點上,第5點說: '在從內存中刪除對象之前,垃圾收集線程調用該對象的finalize()方法,並提供執行任何所需清理的機會'。 那么這件事肯定會發生嗎? 我的意思是在執行垃圾收集器方法之前總是調用finalize()方法嗎?

  2. 垃圾收集器如何知道它需要執行? 例如,我在服務器上部署了一個應用程序,那么GC什么時候執行? 它是周期性地執行,還是當收集了一些(比如說1MB)的垃圾並且執行了一個觸發器或某個或它只是隨機的時候,並且無法確定它何時執行?

  3. 由於垃圾收集沒有發生,它如何降低我的應用程序的性能?

  4. 假設我的堆中有很多垃圾,但垃圾收集器沒有被執行。 如果發生這種情況,那么這不是一個壞行為或JVM的缺陷嗎?

  5. 我們可以說在C / C ++中手動完成的垃圾收集比在Java中更好地考慮到我們作為程序員足夠聰明並知道什么時候需要處理掉“不那么引用”的指針嗎?

  1. 在對象被垃圾回收之前,將始終調用finalize()方法。 沒有“垃圾收集器方法”。

  2. 垃圾收集器會在它感覺到的時候運行。 作為程序員,你無法控制它。 從技術上講,你可以通過制作大量垃圾或調用System.gc(),但你不需要。

  3. 垃圾收集器將在需要時運行。 作為程序員,您不需要關心垃圾收集性能,但是有一些命令行選項可以調整垃圾收集器的行為。

  4. 如果內存不足並且垃圾收集器沒有運行,那就是JVM漏洞。 但它會運行。 垃圾收集器將在需要時以及何時高效運行。 如果在收集任何內容之前讓堆充滿垃圾更有效,那么它就會這樣做。

  5. 這是一個非常主觀的問題,雙方都有充分的理由。 Java的垃圾收集減少了編程錯誤,但C和C ++的手動內存管理提供了更一致的性能和內存使用。

  1. finalize()應該在清理對象之前發生。 問題是 - 你不知道它什么時候會發生(如果它會發生的話)。 不要指望finalize清理,只是在對象失去其范圍之前自己進行清潔。 另請注意, finalize()在垃圾回收周期上運行。 這意味着如果你實現了finalize你的被動對象需要2個周期來清理,這意味着浪費了可以清理的內存。 還有更多的CPU將用於運行finalize ,你不知道什么時候。 如果你有很多已經finalize的對象,那么它們可能會在GC期間一起運行,這可能會暫停整個應用程序很長一段時間

  2. 您可以調整不同的算法來確定垃圾收集何時發生。 此外,它還取決於您分配給JVM的堆大小(以及其他參數,例如舊的與新生成大小,幸存者空間大小等等)。 如果您正在處理小型應用程序 - 通常默認配置就足夠了。 如果您正在編寫大型應用程序並且需要考慮一段時間內的性能,CPU時間和暫停時間(有時GC會暫停整個應用程序) - 那么您最好閱讀堆內存模型以及可以調整的不同GC算法和參數控制GC以更好地滿足您的需求。

  3. 您的應用程序性能會受到發生的GC循環的影響(不會發生GC循環)。 例如 - 如果您的堆太小,您將經常進行循環。 如果你的堆太大,你的循環次數會減少,但每次循環可能需要更長的時間來執行。 同樣,這完全取決於您選擇的GC算法和調整參數以及堆內存分配(年輕代有多少內存,老代有多少,幸存者空間比等等......)

  4. 除非仍有足夠的空間來分配新對象,否則我沒有看到你有大量垃圾並且沒有收集的情況。 當空間用完或即將耗盡時(取決於您選擇的收集算法以及堆大小和其他參數),將有一個集合。

  5. Java垃圾收集器解決了程序員在非托管語言(如CC++遇到的痛苦問題。 它有其優點和缺點。 當你需要絕對控制你的記憶時,你將使用C 如果您想更輕松地編寫系統,並且不介意為GC分配一些額外的內存,並且與GC共享一些CPU時間,那么您可以更快地編寫(也更強大 - 因為更少內存泄漏和其他令人討厭的東西)用java。

[1] finalize調用是垃圾收集的一部分。

[2]垃圾收集器的策略和調用是實現的細節。 因此這里沒有答案。

[3,4]如果你有很多小垃圾,收藏家可能不會進行垃圾收集。 如果“微小”對象保存收集器不知道的內存(圖像可能由一個微小的句柄/指向本機內存的指針),這可能會浪費內存(我認為它是內存泄漏)。

[5] C ++的概念非常不同(這里省略C)。 析構函數可以在確定點執行以釋放分配的資源(參見:RAII)。

暫無
暫無

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

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