我有一个非常便宜的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),因此我相信我的swapfile正在工作。
有人有什么想法吗?谢谢!
发布于 2020-12-30 23:55:39
我不认为这是Linux问题。Java有自己的内存限制,与操作系统无关。我相信您看到这些错误是因为java本身的限制。
不同的JVM有不同的选择。您正在使用Debian,所以很可能使用的是OpenJDK。尽管仍然有可能使用oracle的JVM。因此,除非您在非常小的内存或大量的OpenJDK的默认最大堆大小为256是进程上运行,否则在开始使用交换之前很可能会达到Java自身的限制。
如果您正在使用Oracle的JVM https://stackoverflow.com/questions/4667483/how-is-the-default-max-java-heap-size-determined,这里的答案可能会提供更多信息。
我会尝试通过使用-Xmx运行您的Java程序来调整“最大堆大小”。这个选项在这里描述:https://wiki.openjdk.java.net/display/zgc/Main
值得注意的是,Java的内存管理器没有很好地处理交换空间。当垃圾收集器运行时,任何大范围的交换都可能导致周期性的冻结。
https://unix.stackexchange.com/questions/626874
复制相似问题