java : How to use heap beyond 4 GB memory in 32 bit JVM

标签 java memory jvm heap-memory 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。

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

谢谢你,

最佳答案

Are there other solutions to increasing an application's addressable memory ?

  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 中有 ramdisks http://wikis.sun.com/display/BigAdmin/Talking+about+RAM+disks+in+the+Solaris+OS我认为您应该尝试使用它们来存储数据库(或数据库的临时文件)。 不会像情况(1)那样有额外的序列化/IPC;只有额外的读/写或 mmap/munmap。但是 Ramdisk 比 SSD 快一个数量级,比 HDD 快 3-4 个数量级。

关于java : How to use heap beyond 4 GB memory in 32 bit JVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8082448/

相关文章:

java - 当在 java 中的关闭钩子(Hook)内抛出异常时会发生什么

java - 如何在客户端/服务器 Java 应用程序中传输文件

java - 将哈希码作为一个简单的增量可以吗?

optimization - 关于内存,每个程序员都应该知道什么?

java - Eclipse 不打开 jvm 过时的 mac

java - JFrame.dispose() 与 System.exit()

java.security.spec.InvalidKeySpecException : java. security.InvalidKeyException: key 格式无效

java - 将数据从我的 Java 程序传输到浏览器(Chrome、IE)

c - 为什么需要缓存内存对齐?

ios - UICollectionViewController : Memory used increasing when scrolling