2014-02-16 23 views
1

我是Java的新手。我明白什麼垃圾收集和分頁,交換是孤立的。我想了解它們是如何相互關聯的。 GC是否會導致分頁或交換?我知道GC的主要工作是回收內存。但是,如果需要通過分頁或交換進行回收,還是與GC無關並由OS完成?垃圾收集和交換,分頁之間的關係

+1

如果您的GC觸發分頁/交換,則遇到問題。 GC的實現假設它可以隨機訪問內存,並且如果您在GC期間開始交換應用程序和/或機器,可能會停止。 –

回答

1

要理解關係,請注意Java執行generational garbage collection。在堆上分配了一代年輕的和年老的對象。從JVM的角度來看,它不會關心交換,而是使用它配置的堆大小。但是,堆大小當然會決定管理JVM進程的操作系統的交換行爲。

在年輕一代的收藏中,只收集了相當新的物品。由於最近的分配,這些對象不應該被操作系統換出。當然,如果你爲年輕一代選擇比RAM更大的尺寸,即使收集年輕一代會減慢垃圾收集器的速度,也需要進行交換。

在老生代中,垃圾收集的性能首先取決於收集策略。考慮執行完整垃圾回收的一種天真的算法。該算法必須檢查整個應用程序的對象圖需要訪問整個JVM堆。顯然,整個堆應該適合RAM。否則,垃圾回收將需要大量的交換,這會導致性能不佳。實際上,收集器不會檢查整個對象圖。但是,爲了避免在配置Java應用程序的生產服務器時進行過度交換,選擇適合您的RAM的堆大小仍然是一個好習慣。

0

其實我也是Java世界的新手。我來這裏是因爲我像你一樣對此感到困惑。但是,如果您考慮交換機制,則可能會發現交換和垃圾收集之間的區別。交換是操作系統的一種行爲。垃圾收集是Java jvm的行爲,它是系統的進程/線程。因此,交換和垃圾收集是不同層次的事情。如果內存不夠,交換將發生找出未使用的臨時內存,然後交換出去。

最重要的是,交換可能發生在完整的GC之前。同時,垃圾收集,即全部gc。也可能發生而不交換。一個簡單的例子是:我們用小堆大小來配置JVM。錯誤,我們分配一個大的緩衝區空間,在這種情況下,可能會發生完整的GC,也可能發生OOM。