如何增加 Ubuntu 服务器中分配给进程的内存

如何增加 Ubuntu 服务器中分配给进程的内存

我正在尝试设置一个高度并发的消息服务器,但它似乎占用了大量内存。目前我们的服务器操作系统是 Ubuntu,服务器软件是用 Java 编写的。在负载下,我们遇到了内存不足异常,但我的 8GB RAM 只使用了 70%。

如何为 Java 进程分配更多内存?

答案1

据我所知,有四种可能性:

  1. Ubuntu 默认不限制每个进程的内存,但有办法设置这些限制。了解已完成的操作(如果有的话)的最简单方法是咨询管理服务器的人员。

  2. 如果您使用的是 VPS 而不是实际服务器,则 VM 的配置可能有问题。

  3. 我不知道 Java 的具体工作原理,但 C 在编译时会限制堆栈可用的内存。在这种情况下,您可以指示编译器增加堆栈大小或将更大的数组移至堆。

  4. 如果您的操作系统是 32 位的,则每个进程的可用内存是硬限制的(介于 2 GB 和 4 GB 之间)。如果您的服务器有 64 位 CPU,则可以通过安装 64 位操作系统轻松解决此问题。

可能性 4 很容易排除。要验证它是 1、2 还是 3,您可以使用 gcc 编译以下内容(或用 Java 编写等效代码):

#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
    long bytes = atol(argv[1]), counter, *pointer, words = bytes / sizeof(long);

    // try to allocate memory

    if ((pointer = malloc(bytes)) == NULL)
    {
        puts("Could not allocate memory");
        exit(1);
    }

    // play with memory, so compiler won't optimize allocation out

    for(counter = 0; counter < words; counter++)
        pointer[counter] = counter;

    exit(0);
}

并将您想要分配的内存量作为命令行选项执行。

您应该能够分配所有报告为空闲或缓存的内存。如果可以,则排除可能性 1 和可能性 2。

答案2

Java 进程使用的最大内存是堆,大多数 Java 对象都存储在其中。默认情况下,堆的大小限制为 1 GB 或现有内存的一小部分。当堆空间不足时,会出现 Java 内存不足异常。您可以使用 -Xmx 选项增加(或减少)JVM 的堆大小。例如:

java -Xmx=2048m ...

如果您使用的是 32 位 JVM,则无法可靠地将其设置为超过 ~2.5 到 3 GB。您需要切换到 64 位 JVM 以避免此限制。

相关内容