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

anj*_*anb 5 java memory heap jvm solaris

我们的产品目前运行在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

谢谢,

osg*_*sgx 5

是否有其他解决方案来增加应用程序的可寻址内存?

  1. 使用非共享内存(不是线程;但是进程)在多个进程中拆分单个应用程序.第一个进程可以运行DB,第二个进程可以运行项目的其他部分.您可以使用RMI或共享内存或套接字在进程之间进行通信.
  2. 较低的内存,为OS保留.例如,在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,我认为你应该尝试将它们用于存储数据库(或临时文件) DB).在案例(1)中没有额外的序列化/ IPC; 只有额外的读/写或mmap/munmap.但是Ramdisk的订单比SSD快,比HDD快3-4个订单.


Str*_*ior 3

32 位程序无法处理超过 4GB 的内存地址。它们只是没有足够的位来表示更多的内存。

2^32 = 4 294 967 296

最好的选择是升级到 64 位 JRE。