나는 정말 저렴한 Debian 서버를 가지고 있지만 어떤 이유로 Java 프로세스가 모든 메모리를 사용한 다음 스왑 공간을 사용하는 대신 "OutOfMemoryError"를 발생시킵니다.
1GB의 스왑 공간이 있고 내가 무엇을 하든 htop
사용량이 표시됩니다 .0/1024M
사용해 보았지만 sudo sysctl vm.swappiness=100
여전히 스왑 공간이 사용되지 않습니다
추가 사항으로 sudo swapon --show
다음이 표시됩니다.
NAME TYPE SIZE USED PRIO
/swapfile file 1024M 0B -1
(그리고 chmod 권한은 으로 설정되어 있습니다 600
.) 그래서 스왑 파일이 작동하고 있다고 생각합니다.
누구든지 아이디어가 있나요? 감사해요!
답변1
나는 이것이 리눅스 문제가 아니라고 생각합니다. Java에는 운영 체제와 관계없이 자체 메모리 제한이 있습니다. Java 자체의 제한으로 인해 이러한 오류가 발생한다고 생각합니다.
JVM마다 옵션이 다릅니다. Debian을 사용하고 있으므로 OpenJDK를 사용하고 있을 가능성이 높습니다. 여전히 Oracle의 JVM을 사용할 가능성이 있습니다. OpenJDK의 기본 최대 힙 크기는 256MB입니다., 그래서 당신이 달리고 있지 않는 한진짜RAM이 작거나 Java 프로세스가 많은 경우 스왑을 사용하기 전에 Java 자체 한계에 도달할 가능성이 높습니다.
Oracle의 JVM을 사용하는 경우 여기에 있는 답변이 더 많은 정보를 제공할 수 있습니다.https://stackoverflow.com/questions/4667483/how-is-the-default-max-java-heap-size-dependent
Java 프로그램을 실행하여 "최대 힙 크기"를 조정하려고 합니다 -Xmx
. 옵션은 아래에 설명되어 있습니다.https://wiki.openjdk.java.net/display/zgc/Main
Java의 메모리 관리자가 스왑 공간을 잘 처리하지 못한다는 점은 주목할 가치가 있습니다. 스왑을 과도하게 사용하면 가비지 수집기가 실행되는 동안 주기적인 정지가 발생할 수 있습니다.