强制使用内存交换

强制使用内存交换

我有一个 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

我不认为这是 Linux 的问题。 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 的内存管理器不能很好地处理交换空间。当垃圾收集器运行时,任何大量使用交换都可能导致周期性冻结。

相关内容