2011-04-25 38 views
0

我在Windows 7 64bit上運行1.6.0_25 64位。Java JVM保持對操作系統的內存分配

我想讓JVM以最大的內存運行,因爲我的應用程序內存密集,但可惜......內存分配不會建立起來,並且有很多從Windows的頁面錯誤繼續帶來在接下來設置虛擬內存。

我正在運行的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的對象保持的ArrayList和浮動的。

這樣做,我發現我的Java內存不會被交換(所以,我想堆內存有點不同於堆棧在這裏)[哦,我沒有改變所有的代碼靜態類型以及 - 我知道,非常糟糕的編程風格]

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

+0

所以,如果我得到這個權利,你試圖有目的地創建一個內存泄漏?或者你需要文件始終存在於內存中?我有興趣瞭解您的使用案例。 – lobster1234 2011-04-25 10:34:59

+0

加載文件後,您是否保留對「byte []文件」的引用?你的系統有多少內存?你的其他代碼用這個文件做什麼? – WhiteFang34 2011-04-25 10:37:04

+0

其實...我最初使用BufferReader讀取1GB文件並處理輸入和輸出到BufferedWriter ... 該系統應該創建近5GB的處理數據。 令人難過的是,觀察內存使用情況,它在6小時內從30K增加到.5G的速度非常緩慢,而且每增加k個字節,又增加了一個或兩個IO讀取操作...... – 2011-04-25 10:41:14

回答

1

決定進程內存的哪些部分保留在RAM中,哪些交換出來是由操作系統而不是由JVM完成的。通常,操作系統會保留在RAM中經常訪問的內存 - 如果不是,那麼爲什麼你需要它?

可能有OS API允許您將某個內存「固定」在RAM中,但此功能未由Java公開。

但是對於您的要求,您應該考慮將文件memory-mapped而不是明確地讀取它。它可能會快得多。

+0

好的......那麼,我該如何處理這樣一個事實,即我正在閱讀的數據在ArrayLists和HashMaps中以預設的開始大小結束 這是正在被分頁的部分...以及算法我正在執行的是非常密集的內存... 我被推薦遷移到Linux ...問題在這裏......它會有什麼不同的行爲,並允許我保持活動內存ArrayLists? – 2011-04-25 10:52:12

+0

@Enas:由於分頁是操作系統事務,因此不同的操作系統可能會有不同的行爲。消費者版本的Windows傾向於針對最終用戶應用程序而不是數據處理進行優化。轉移到Windows Server操作系統也可能導致不同的分頁行爲。雖然我會說,一旦你的算法密集處理所有的數據,它應該在任何一個理智的操作系統上被分頁。 – 2011-04-25 11:31:20

+0

謝謝,這很有道理。我正在考慮安裝一個基於系統的Linux,看看是否能解決這個問題......你會推薦Ubuntu還是有更好的「服務器」來表現Linux發行版。 謝謝。 – 2011-04-25 11:51:03

0

Java會盡力將所有應用程序保留在內存中,或者換句話說,它將作爲最後的手段進行交換,因爲如果將其內存中的任何內存交換到磁盤時,性能會非常糟糕。

如果您的Java應用程序正在交換到磁盤,則會因爲您的應用程序爲您擁有的系統使用了太多的內存。如果你的應用程序是內存密集型的,你必須使用這麼多的內存,我建議你的系統有足夠的內存。 BTW。你可以購買一臺8 GB的服務器,售價約500美元,新的16 GB工作站售價1000美元。 ;)

+0

我正在使用24G內存和24G虛擬內存的系統上運行。我正在計劃消除虛擬內存,因此迫使系統使用所有可用的物理內存...... – 2011-04-25 15:45:45

+0

您確定這是導致交換的原因,如果您有24 GB並且您正在使用〜3 GB,我不明白你爲什麼要交換虛擬內存。系統上必須有其他的東西引起這種情況。 – 2011-04-25 20:59:52