2017-09-06 22 views
0

我有一個情況,有2個文件A和B,並且數據在它們中都被連續寫入(如流)。如何在java中執行用戶控件緩存驅逐/垃圾收集?

現在我知道文件A和B都將爭奪內存,垃圾收集器將決定將替換哪個文件的頁面。

我想通過使垃圾收集器青睞文件A來控制垃圾收集(即垃圾收集器應該總是選擇驅逐文件B的頁面,而不是A)。其他可能性是強制將文件B寫入磁盤而不是緩存到內存中。

這些事情可以發生在Java?

回答

1

我懷疑你是在混淆的內存管理與垃圾收集。是的,垃圾收集是內存管理的一種形式,但在討論「內存空間不足時將哪些內存頁面交換到磁盤」時,並不是你所說的。這不是垃圾收集,因爲仍然有活動的引用A和B文件。垃圾收集器在沒有對象的引用之前不會執行任何操作。

你想控制內存頁面交換而不是垃圾收集。如果我對此有錯,我相信我會在評論中得到糾正,但我不認爲你可以用Java控制哪些頁面的內存在可用內存不足時交換到磁盤。

1

你不能強迫Java去做垃圾收集。您可以撥打System.gc()來請求JVM執行垃圾回收。

要確保對象已準備好進行垃圾回收,您可以將其分配給null。這樣你就可以確保當垃圾收集器運行時獲取這個對象並從堆中移除。

0

Java具有自動垃圾收集功能,可識別哪些對象正在使用中,哪些不在,以及刪除未使用的對象。

關於垃圾收集的一個好來源在Java是here

0

你的問題的描述缺乏某些細節,具體而言,是寫入文件的順序,還是有參與隨機訪問?

正如GeneSummons正確指出的那樣,您在與操作系統混淆的JVM中有內存管理。即使sun.misc.Unsafe不會讓你從Java應用程序的操作系統級別上的分頁活動的控制。

可能想要看的是使用內存映射文件,但這取決於您是否使用隨機訪問進行寫操作。如果你所做的只是順序編寫,這很可能是沒有用的。雖然這不會給你過在操作系統級別的文件的分頁控制它可以爲你提供解決您的問題的更有效的方式。

還有一篇關於此主題的文章,https://howtodoinjava.com/java-7/nio/java-nio-2-0-memory-mapped-files-mappedbytebuffer-tutorial/