gpt4 book ai didi

java - 如何让 JVM 使用服务器的最大(全部剩余)内存

转载 作者:行者123 更新时间:2023-11-30 08:33:27 27 4
gpt4 key购买 nike

我有一个 DFS 算法 java 控制台应用程序,当提供更多内存时它运行得更快。只是一个 DFS 算法应用程序,既没有 I/O 也没有其他外部 JVM 资源使用。它只消耗 CPU 和内存。该应用程序可以使用 1GB 内存运行,但使用 2GB 内存运行速度更快。提供更多内存,应用程序运行速度更快。我没有触及速度限制,因为提供了 12GB 内存。所以我必须使用服务器的所有剩余内存来加速它。并且应用不需要并行,一次只能请求一个。

而且我需要将应用程序安装在具有不同内存大小的不同服务器上。

有没有办法让JVM使用服务器所有剩余的内存?

-XX:MaxRAMFraction=1

MaxRAMFraction 并不是每个服务器都好,有些服务器会因为位置内存故障而导致启动 JVM 失败,有些效果很好。

使用包装器应用程序获取系统剩余内存,并减去 Xmx 以外的一些内存使用量,然后使用相同的 Xms 和 Xms 启动真正的应用程序。该方法也会导致 JVM 内存分配错误。因为下面的代码返回的内存远远超过我们可以使用的内存,而不仅仅是减去 Xss256m 或更多的非堆 JVM 内存。

com.sun.management.OperatingSystemMXBean mbean = (com.sun.management.OperatingSystemMXBean)
ManagementFactory.getOperatingSystemMXBean();
long size = mbean.getFreePhysicalMemorySize();

那么有没有什么好的方法可以让JVM使用服务器的所有剩余内存呢?

最佳答案

对于大内存区域,我使用堆外内存,这减少了 GC 的开销,其中一个好处是它可以在运行时是任意大小,如果你小心操作,它甚至可以大于主内存。您可以直接使用 ByteBuffer,但我使用我编写的扩展 ByteBuffer 功能的库(>> 2 GB 和线程安全)Chronicle Bytes最大的任何人使用它是映射到磁盘的 ~100 TB 虚拟内存。

我们在 Chronicle Bytes 之上有两个数据结构,一个键值存储 Chronicle Map和队列/日志 Chronicle Queue .这可以通过更高级别的接口(interface)更轻松地在堆外存储数据。

堆的工作方式,它必须在启动时将最大堆大小保留为单个连续的虚拟内存块。特别是,GC 假设在清理时随机访问此内存,这意味着如果您稍微过度使用内存,可能是因为进程在您之后启动并且一些堆被换出,您将看到性能急剧下降为您的整台机器。 Windows 往往会开始交换您的 GUI,这意味着您无法在没有电源循环的情况下取回控制权。 Linux 并没有那么糟糕,但此时您会想要终止您的进程。如果您的机器的使用发生变化,这使得调整它的大小以使用所有内存变得非常困难。

相比之下,通过使用虚拟内存,GC 不会触及它,因此未使用的部分几乎没有影响。您可以拥有多倍于主内存的虚拟内存区域,但只有您当前的工作集很重要,这是一个在运行时完全由您控制的大小。注意:在 Linux 上,您的虚拟内存大小可以是可用磁盘空间的 1000 倍,但请小心使用,如果您因触摸太多页面而用完,您的程序将崩溃。

关于java - 如何让 JVM 使用服务器的最大(全部剩余)内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39462735/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com