我们的产品目前运行在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位*
谢谢,
答案 0 :(得分:5)
是否有其他解决方案来增加应用程序的可寻址内存?
此外,每个真正的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。