簡體   English   中英

Java JVM針對操作系統保留內存分配

[英]Java JVM Keep Memory Allocation Against Operating System

我在Windows 7 64bit上運行1.6.0_25 64bit。

我試圖讓JVM在最大內存下運行,因為我的應用程序占用大量內存...但是可悲的是...內存分配沒有建立,並且Windows出現了很多Page Faults來繼續帶來下一組虛擬內存。

我正在運行java -Xms2G -Xmx3G測試

下面的代碼是我試圖將整個文件導入...,這樣我就不會遇到頁面錯誤以進行讀取。

File f = new File("veryLARGEfile.txt");
FileInputStream in = new FileInputStream(f);
int i = (int) f.length();
System.out.println("Bytes in file: " + i);

byte[] file = new byte[i];
i = in.read(file);
System.out.println("Bytes read: " + i);

使用這種方法,我可以看到在Windows任務管理器中,系統在讀取文件時達到了2G的內存容量……但是一旦讀取完成……內存又重新下降了!!!!

這是一個主要問題...我需要整個字節數組保留在活動內存中。

謝謝你


我修改了代碼以使用基本數組類型int [] []和float [] []來保存數據,而不是保留包含int和float的對象的ArrayLists。

這樣做,我發現我的Java內存沒有被交換(因此,我認為堆內存與此處的堆棧有所不同)[哦,我也將所有代碼也更改為靜態類型-我知道,非常糟糕編程風格]

我現在遇到的問題是如何處理我的HashMap ...嘗試建立查找表的所有嘗試都因O(n ^ 2)運行時間而失敗!!!

進程的哪些部分要保留在RAM中以及哪些要交換出去是由操作系統而不是由JVM決定的。 通常,操作系統會將經常訪問的內存保留在RAM中-如果不是,為什么在那兒需要它?

可能會有OS API,使您可以“固定” RAM中的特定內存,但是Java並未公開此功能。

但是出於您的要求,您應該考慮將文件映射內存,而不是顯式地讀取它。 它可能會更快。

Java竭盡全力將其所有應用程序保留在內存中,或者換種方式,它作為最終手段換出了,因為如果將其任何內存換成磁盤,它的性能都會很差。

如果您的Java應用程序正在交換到磁盤,則是因為您的應用程序為您的系統使用了過多的內存。 如果您的應用程序占用大量內存,並且您必須使用這么多的內存,那么我建議您確保系統具有足夠的內存。 順便說一句。 您可以以$ 500的價格購買具有8 GB的服務器,並以$ 1000的價格購買新的16 GB工作站。 ;)

暫無
暫無

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

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