xmlx에 도달하기 전에 Java 프로그램의 메모리가 부족합니다.

xmlx에 도달하기 전에 Java 프로그램의 메모리가 부족합니다.

Redhat CentOS 6.4에서는 약 3GB RAM을 사용하여 소수의 프로세스만 실행됩니다(시스템에는 12GB 사용 가능). 프로세스 중 하나는 WSO2ESB 서버(java)이며 다음 매개변수로 시작합니다.

 -Xms2048m -Xmx3072m

잠시 후 OutOfMemory 예외가 발생하지만Java 프로세스(WSO2ESB) 프로세스는 3GB도 사용하지 않습니다.. jconsole에서 해당 매개변수가 올바르게 설정된 것을 확인할 수도 있습니다(Linux 서버에는 현재 약 9GB의 여유 RAM이 있습니다).

Linux는 구성된 3GB RAM을 제공하지 않습니까?

정확히 동일한 Windows 설치에서 Java 프로세스는 문제 없이 3GB RAM을 사용할 수 있습니다.

여기에 이미지 설명을 입력하세요 0.3~1.0GB 사이의 힙 메모리 사용량을 보여주는 jconsole의 스크린샷. OutOfMemory 예외가 발생하는 순간 힙 메모리는 0.5GB였지만 프로세스에 사용할 수 있는 용량은 3GB였지만 그렇지 않습니다.

편집: Java 프로세스 로그 추가:

java.lang.OutOfMemoryError: unable to create new native thread

EDIT2: 무료 -m 출력이 추가되었습니다. 여기에 이미지 설명을 입력하세요

답변1

문제를 해결했습니다. wso2esb는 1000개가 넘는 스레드를 사용하고 있었습니다. 하지만 Linux에서는 사용자가 사용할 수 있는 기본 스레드 양이 1024로 설정되어 있습니다. 사용자에 대한 제한을 늘려야 했고 이제 모든 것이 잘 작동합니다.

그렇게 하려면: /etc/security/limits.conf를 열고 사용자에 대해 다음 두 줄을 추가하십시오.

myuser             soft    nproc           8192
myuser             hard    nproc           8192

여기에 이미지 설명을 입력하세요

답변2

Java에는 여러 세대의 힙 공간, 새로운 영구 세대가 있습니다.

Xmx를 너무 높게 설정하면 힙에 사용되며, 전체 힙을 사용하지 않더라도 메모리가 부족해질 수 있습니다. 이는 일반적으로 PermGen 공간이 부족할 때 발생합니다.

힙의 영구 생성은 문자열 풀과 클래스, 메소드 및 기타 Java 프리미티브와 관련된 JVM에 필요한 다양한 메타 데이터를 저장하는 데 사용됩니다. Perm 공간은 일반적으로 64MB이므로 클래스가 많거나 문자열이 많으면 부족할 수 있습니다.

다음을 추가하여 permgen 크기를 늘려보세요.

-XX:MaxPermSize=256m

Java 시작 옵션에.

답변3

힙의 데이터 세그먼트 크기는 얼마입니까 -Xms2048m -Xmx3072m?

데이터 세그먼트 크기는 최대 힙 크기(이 경우 3072m)와 일치해야 합니다. 따라서 데이터 세그먼트 크기는 최소 3221225472(바이트 단위 3*1024*1024*1024 = 3GB) 로 설정되어야 합니다.

관련 정보