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