동시성 메시징 서버를 설정하려고 하는데 메모리를 많이 사용하는 것 같습니다. 현재 우리의 서버 OS는 Ubuntu이고 서버 소프트웨어는 Java로 작성되었습니다. 로드 시 메모리 부족 예외가 발생하지만 8GB RAM의 70%만 사용됩니다.
Java 프로세스에 더 많은 메모리를 할당하려면 어떻게 해야 합니까?
답변1
내가 아는 한, 네 가지 가능성이 있습니다.
Ubuntu는 기본적으로 프로세스당 메모리를 제한하지 않지만 이러한 제한을 설정하는 방법이 있습니다. 어떤 작업이 수행되었는지(있는 경우) 가장 쉽게 알 수 있는 방법은 서버를 관리하는 사람에게 문의하는 것입니다.
실제 서버가 아닌 VPS를 사용하는 경우 VM 구성에 문제가 있을 수 있습니다.
Java가 어떻게 작동하는지 정확히 모르지만 C는 컴파일할 때 스택에 사용 가능한 메모리를 제한합니다. 이 경우 스택 크기를 늘리거나 더 큰 배열을 힙으로 이동하도록 컴파일러에 지시할 수 있습니다.
OS가 32비트인 경우 프로세스당 사용 가능한 메모리는 엄격하게 제한됩니다(2GB에서 4GB 사이). 서버에 64비트 CPU가 있는 경우 64비트 OS를 설치하면 쉽게 문제를 해결할 수 있습니다.
가능성 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 개체가 저장되는 힙입니다. 기본적으로 1GB 또는 존재하는 메모리의 일부로 제한됩니다. 힙 공간이 부족하면 Java 메모리 부족 예외가 발생합니다. -Xmx 옵션을 사용하여 JVM의 힙 크기를 늘리거나 줄일 수 있습니다. 예:
java -Xmx=2048m ...
32비트 JVM을 사용하는 경우 ~2.5~3GB 이상으로 안정적으로 설정할 수 없습니다. 이 제한을 피하려면 64비트 JVM으로 전환해야 합니다.