最近我是想写一个 JVM 系列,然后全部都发表到公众号里,在公众号里形成一个菜单。方便我的粉丝阅读!
这写这篇文章之前,我在百度里搜索了一下关于 java.lang.OutOfMemoryError: Out of swap space 问题的内容,结果不胜理想。基本上很少有讲清楚的,于是我就谷歌,总结了本文。
java.lang.OutOfMemoryError: Out of swap space 错误,根据自己意思,我们差不多也能看出来是交换空间(swap space,虚拟内存) 不足。
详细的说,就是这个错误是当虚拟机向本地操作系统申请内存失败时抛出的。这和你用完了堆或者持久化中的内存的情况有些不同。这个错误通常是在你的程序已经逼近平台限制的时候产生的。这个信息告诉你的是,你可能已经用光了物理内存以及虚拟内存了。由于虚拟内存通常是用磁盘作为交换分区,因此你最先想到的解决方法可能是先增加交换分区的大小。不过我从没见过一个程序在频繁进行内存交换还能正常运行的,所以这个方法可能不会起到什么作用。
在 JVM 启动的时候,我们可以通过 -Xmx 等参数来限制 JVM 的最大内存。当 JVM 使用的内存总量超过可用的物理内存时,操作系统就会用到虚拟内存。
看过前面文章的也都知道,我一直在强调任何 OutOfMemoryError 错误,多数都是你的程序引起的。所以,这类问题更多的可能是应用程序的本地内存泄漏(native leak)引起的。
想增加虚拟内存(swap space) 的大小的话,很简单。比如执行下面的命令:
swapoff -a dd if=/dev/zero of=swapfile bs=1024 count=655360 mkswap swapfile swapon swapfile
这段命令创建了一个大小为 640MB 的 swapfile(交换文件) 并启用该文件。
如果通过增加了你的虚拟内存大小还是不能解决你的问题,建议你按照我的第一篇文章《为什么会产生 java.lang.OutOfMemoryError: Java heap space 错误以及如何解决?》中的排查步骤排查你的程序。
当然如果你用的 JDK 版本过低,我建议你升级它们。因为低版本的 JDK 中有很多对应的 Out of swap space bug 存在!
参考资料
- java.lang.OutOfMemoryError:Out of swap space?
: » 深入理解 java.lang.OutOfMemoryError: Out of swap space 错误
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/251922.html