如何在Windows上为我的JDK分配8 GB(而不是1 GB)RAM



Windows上的JDK最多占用大约2 GB RAM。即使我们为JDK分配了更多的RAM;它不接受它。如果我需要在 Windows 上运行一个需要 8 GB RAM 的进程;我怎样才能实现它?

我们是否有任何其他提供商提供的任何 JDK 来支持它?Memcached 为我们提供了额外的缓存,可以使用...但这不是我要找的。假设我需要在我的窗口盒上运行带有 8 GB RAM 的 jMeter;Memcached肯定无济于事。有没有供应商为我提供这个?以前我以为兵马俑就是这样做的;但看起来那也像记忆缓存。

我正在使用Windows 7。如果需要,我也可以使用Windows Server。我只需要让它运行。

我所知,Windows上每个32位进程有2GB的内存限制。但是,此页面似乎表明存在将其扩展到3GB的寄存器设置。具体IMAGE_FILE_LARGE_ADDRESS_AWARE

http://msdn.microsoft.com/en-gb/library/windows/desktop/aa366778(v=vs.85).aspx

因此,如果您使用的是 32 位 JDK 并坚持使用它,那是您最好的选择,但是如果您可以升级到 64 位 JDK,请这样做,就像您在 64 位版本的 Windows 上使用 64 位 JDK 一样,此限制变为 8TB

64位操作系统上使用64位JDK可以修复它

如果您

使用 -ms8g -mx8g 并且它正确启动,那么它的"最小"堆大小为 8 GB。 但是,如果您的程序不使用 8 GB,它仍然可能只有 2 GB 或更少。即,无论您提供什么设置,hello World 程序都不会使用 8 GB。(除了一个晦涩难懂的,我认为没有任何用处;)

使 32 位应用程序成为 32 位应用程序的原因是它拥有的有限地址空间。 它仍然可以使用 64 位甚至 128 位数据。它是它可以解决的有限内存量来区分它。 Windows 将分配的地址空间用于其自身目的,这意味着堆的实际限制约为 1.2-1.5 GB(不是 2^32 而是 4 GB)

值得注意的是,64 位 JVM 仍然使用 32 位引用,堆大小约为 30 GB.即引用不是普通内存地址,因为它们是 32 位程序。

我已经成功地在我的64位Windows机器上使用12G(-Xmx12G),并且(64位)JVM使用了它的每一个字节。

我偶然发现的唯一问题是,有时需要在命令行上显式提供-d64,如果是 64 位 JDK/JRE,则为 event。

如果你有大量的缓存数据,它们最好驻留在java堆之外。否则,GC 将花费大量时间反复且徒劳地遍历它。

Terracotta的BigMemory通过将数据放在Java堆之外的直接ByteBuffer中来实现这一点。也许也有免费/开放的。

最新更新