簡體   English   中英

java:如何在 32 位 JVM 中使用超過 4 GB 內存的堆

[英]java : How to use heap beyond 4 GB memory in 32 bit JVM

我們有一個當前在 32 位 1.6 JRE 上運行的產品。 我們正在使用 Berkeley DB,它在 4 GB 地址空間中消耗了大約 2.5 GB RAM。 這為 JVM 地址空間留下了大約 750 MB 的內存。

我們目前正在解決當前設置的 OutOfMemory 問題。 最好將我們的 JVM 堆大小增加到 1.5 GB,同時仍保留 Berkeley DB 的 2.5 GB 空間。 有沒有辦法在 32 位 JVM 中訪問超過 4 GB 的 RAM/堆? 我正在考慮以下解決方案
1) 使用 GC 性能更好的 JVM——這會給我帶來邊際結果——我可以獲得大約 50-100 MB 的工作內存
2)像memcached或“進程外ehcache”之類的東西——這可以讓我得到盡可能多的硬件允許的IPC/序列化開銷。

是否有其他解決方案來增加應用程序的可尋址內存?

該解決方案應該適用於運行 sparc 的 solaris 10。

*更新:由於使用本機共享庫,現在,即使操作系統是 64 位,我們也無法切換到 64 位 JVM *

謝謝,

是否有其他解決方案來增加應用程序的可尋址內存?

  1. 在具有非共享內存(不是線程;而是進程)的多個進程中拆分單個應用程序。 第一個進程可以運行數據庫,第二個進程可以運行項目的其他部分。 您可以使用 RMI 或共享內存或套接字在進程之間進行通信。
  2. 較低的內存,為操作系統保留。 例如,在 x86-32 PAE 上,操作系統可以保留小於 1 GB 的 4 GB 虛擬地址空間。 (例如“4GB / 4Gb 拆分”,在Oracle Linux上支持)
  3. 將一些數據放入磁盤。 磁盤可以是 RAM 磁盤以提高速度; 或者它可以是真正的磁盤,操作系統將使用“頁面緩存”加速對文件的訪問。

此外,每個真正的 SPARC(不是古老的 SuperSparc 或窮人 LION)都是 64 位的。 因此,切換到 64 位版本的操作系統會更容易。 我不了解 Solaris,但在 linux 中,可以在 64 位操作系統之上運行 32 位應用程序。 64 位操作系統將允許您運行 64 位 JVM。

更新:Solaris http://wikis.sun.com/display/BigAdmin/Talking+about+RAM+disks+in+the+Solaris+OS 中有 ramdisks,我認為您應該嘗試使用它們來存儲數據庫(或臨時文件數據庫)。 不會像情況 (1) 那樣有額外的序列化/IPC; 只有額外的讀/寫或 mmap/munmap。 但是 Ramdisk 比 SSD 快,比 HDD 快 3-4 個數量級。

32 位程序無法處理超過 4GB 的內存地址。 他們只是沒有足夠的位來表示更多的內存。

2^32 = 4 294 967 296

最好的辦法是升級到 64 位 JRE。

我建議您在 32 位 JVM 中運行 32 位共享本機庫,並在 64 位 JVM 中運行其他所有內容。 您可以讓 64 位 JVM 調用 32 位 JVM 來完成它所做的任何事情。 我假設您的大部分數據/內存需求可以移至 64 位 JVM。

暫無
暫無

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

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