繁体   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