首页 文章

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

提问于
浏览
5

我们的产品目前运行在32位1.6 JRE上 . 我们正在使用Berkeley DB,它占用4 GB地址空间大约2.5 GB的RAM . 这为JVM地址空间留下了大约750 MB的内存 .

我们_2530242_的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位,我们也无法切换到64位JVM

谢谢,

3 回答

  • 3

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

    • 在具有非共享内存的多个进程中拆分单个应用程序(不是线程;而是进程) . 第一个进程可以运行DB,第二个进程可以运行项目的其他部分 . 您可以使用RMI或共享内存或套接字在进程之间进行通信 .

    • 较低的内存,为OS保留 . 例如 . 在x86-32上,PAE允许操作系统保留小于1 GB的4 GB虚拟地址空间 . (例如"4GB / 4Gb split",Oracle Linux支持)

    • 将一些数据放入磁盘 . 磁盘可以是RAM磁盘以提高速度;或者它可以是真正的磁盘,操作系统将使用"page cache"加速对文件的访问 .

    而且,每个真正的SPARC(不是古老的SuperSparc或穷人LION)都是64位的 . 因此,切换到64位版本的操作系统会更容易 . 我不了解Solaris,但在linux中可以在64位操作系统之上运行32位应用程序 . 而64位操作系统将允许您运行64位JVM .

    更新:Solaris _1530247中有ramdisks,我认为你应该尝试将它们用于存储数据库(或DB的临时文件) . 在案例(1)中没有额外的序列化/ IPC;只有额外的读/写或mmap / munmap . 但是Ramdisk的订单比SSD快,比HDD快3-4个订单 .

  • 5

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

    2 ^ 32 = 4 294 967 296

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

  • 3

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

相关问题