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

时间:2011-11-10 16:03:51

标签: java memory jvm heap 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或“out of process ehcache”之类的东西 - 这可以让我获得与硬件允许的IPC /序列化的开销。

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

该解决方案应该适用于运行sparc的solaris 10。

* 更新:由于使用本机共享库,我们现在无法切换到64位JVM,即使操作系统是64位*

谢谢,

3 个答案:

答案 0 :(得分:5)

  

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

  1. 使用非共享内存(不是线程;但是进程)在多个进程中拆分单个应用程序。第一个进程可以运行DB,第二个进程可以运行项目的其他部分。您可以使用RMI或共享内存或套接字在进程之间进行通信。
  2. 内存较低,为操作系统保留。例如。在x86-32上,PAE允许操作系统保留小于1 GB的4 GB虚拟地址空间。 (例如“{4} / 4Gb拆分”,Oracle Linux支持)
  3. 将一些数据放入磁盘。磁盘可以是RAM磁盘以提高速度;或者它可以是真正的磁盘,操作系统将使用“页面缓存”加快对文件的访问。
  4. 此外,每个真正的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个订单。

答案 1 :(得分:3)

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

  

2 ^ 32 = 4 294 967 296

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

答案 2 :(得分:3)

我建议您在32位JVM中运行32位共享本机库,并在64位JVM中运行其他所有内容。您可以让64位JVM调用32位JVM来执行任何操作。我假设您的大部分数据/内存要求可以移动到64位JVM。