本文是java内存溢出系列第6小篇。

JVM启动参数指定了最大内存限制。如 -Xmx 以及相关的其他启动参数. 假若JVM使用的内存总量超过可用的物理内存, 操作系统就会用到虚拟内存。

错误信息 java.lang.OutOfMemoryError: Out of swap space? 表明, 交换空间(swap space,虚拟内存) 不足,是由于物理内存和交换空间都不足所以导致内存分配失败。

原因分析

如果 native heap 内存耗尽, 内存分配时, JVM 就会抛出 java.lang.OutOfmemoryError: Out of swap space? 错误消息, 这个消息告诉用户, 请求分配内存的操作失败了。

Java进程使用了虚拟内存才会发生这个错误。对 Java的垃圾收集 来说这是很难应付的场景。即使现代的 GC算法 很先进, 但虚拟内存交换引发的系统延迟, 会让 GC暂停时间 膨胀到令人难以容忍的地步。

通常是操作系统层面的原因导致 java.lang.OutOfMemoryError: Out of swap space? 问题, 例如:

  • 操作系统的交换空间太小。

  • 机器上的某个进程耗光了所有的内存资源。

当然也可能是应用程序的本地内存泄漏(native leak)引起的, 例如, 某个程序/库不断地申请本地内存,却不进行释放。

解决方案

这个问题有多种解决办法。

第一种, 也是最简单的方法, 增加虚拟内存(swap space) 的大小. 各操作系统的设置方法不太一样, 比如Linux,可以使用下面的命令设置:

swapoff -add if=/dev/zero of=swapfile bs=1024 count=655360mkswap swapfileswapon swapfile

其中创建了一个大小为 640MB 的 swapfile(交换文件) 并启用该文件。

因为垃圾收集器需要清理整个内存空间, 所以虚拟内存对 Java GC 来说是难以忍受的。存在内存交换时, 执行 垃圾收集 的 暂停时间 会增加上百倍,甚至更多, 所以最好不要增加虚拟内存。

如果程序允许环境还受到 “坏邻居效应” 的干扰, 那么JVM还要和其他程序竞争计算资源, 提高性能的办法就是单独部署到专用的服务器/虚拟机中。

大多数时候, 我们唯一能做的就是升级服务器配置, 增加物理机的内存。当然也可以进行程序优化, 降低内存空间的使用量, 通过堆转储分析器可以检测到哪些方法/代码分配了大量的内存。


往期回顾:

java内存溢出系列(1): Java heap space

java内存溢出系列(2): GC overhead limit exceeded

java内存溢出系列(3): Permgen space

java内存溢出系列(4): Metaspace

java内存溢出系列(5): Unable to create new native thread

vb实时错误6 溢出_java内存溢出系列(6): Out of swap space?相关推荐

  1. java数组内存溢出_Java内存溢出问题总结

    使用Java那么久,在此总结一下Java中常见的内存溢出问题以及对应的解决思路 堆溢出 报错信息 java.lang.OutOfMemoryError: Java heap space 报错原因 堆中 ...

  2. java 内存 溢出_java内存溢出的几种原因和解决办法是什么?

    java内存溢出的几种原因和解决办法是什么? java内存溢出的几种原因和解决办法是: 第一类内存溢出,也是大家认为最多,第一反应认为是的内存溢出,就是堆栈溢出: 那什么样的情况就是堆栈溢出呢?当你看 ...

  3. java 如何排查内存溢出_java 内存溢出排查

    测试代码,如下示例: import java.util.ArrayList; import java.util.List; /** * @Description 测试内存溢出, 启动时设置参数,最大堆 ...

  4. docker java 内存溢出_java内存溢出

    与此问题类似jmeter Error occurred during initialization of VM Could not reserve enough space_萧木易的博客-CSDN博客 ...

  5. java list 内存溢出_java内存溢出的2种情况

    java程序员在面试经常被问到内存om之后如何处理,但是实际在工作中遇到此类问题的情况却又非常少. 进过自己一番总结内存溢出主要分为2种: 一.堆内存溢出 OutOfMemoryError 从jvm的 ...

  6. java什么时候可能产生内存溢出_JAVA内存泄露和内存溢出

    1)概念: 内存溢出:指在指定大小的内存空间,写入了超出大小的数据,从而导致了内存溢出. 内存溢出:指程序运行过程中无法申请到足够的内存而导致的一种错误. 内存溢出通常发生于OLD段或Perm段垃圾回 ...

  7. java 溢出与泄露_Java内存溢出与栈溢出

    一.背景知识 1.JVM体系结构 2.JVM运行时数据区 3.JVM内存模型 JVM运行时内存 = 共享内存区 + 线程内存区 3-1.共享内存区 共享内存区 = 持久带 + 堆 持久带 = 方法区 ...

  8. linux 内存溢出排查_java 内存溢出 栈溢出的原因与排查方法

    1. 内存溢出的原因是什么? 内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出.如果出现这种现象可行代码排查: 一)是否应用中的类中和引用变量过多使用了Static修饰 ...

  9. java内存溢出原因及解决_java内存溢出的原因和解决方法

    java内存溢出的原因和解决方法 发布时间:2020-06-15 17:57:39 来源:亿速云 阅读:85 作者:元一 内存溢出含义: 内存溢出(out of memory)通俗理解就是内存不够,通 ...

最新文章

  1. switch里能不能用continue?
  2. erdas叠加显示_ERDAS操作技巧
  3. 安装TokuDB引擎
  4. ecs服务器数据迁移_如何非常方便地从Windows文件服务器把数据完整地迁移到ONTAP Select...
  5. HDU-4675 GCD of Sequence 数学
  6. shell脚本手动执行成功,定时任务调用失败的解决方法。
  7. php类的实例化方法,php中类的定义和实例化方法
  8. ubuntu下mysql数据库存储路径修改
  9. 干货 | attention超全综述
  10. 同方linux系统怎样下载软件,同方易教管理平台V2.4使用方法
  11. C++过河(动态规划dp)
  12. C语言——PTA 统计素数并求和
  13. WIN10彻底禁用UAC(用户账户控制)
  14. From.List用法详解
  15. 2022年第五届全国青少年人工智能创新挑战赛
  16. 【GNSS】GREAT多频多系统GREAT-UPD开源代码-第三章 中间及结果文件格式
  17. 多媒体技术计算题、操作题
  18. 数据仓库是什么?和数据库有何区别?
  19. manjaro 配置 独立显卡驱动
  20. 水桶分水问题详解(C++实现)

热门文章

  1. nexus3下载地址
  2. 使用thymeleaf的时候报元素类型“meta“必须由匹配的结束标记
  3. 丁香园 武汉 神童_扒一扒武汉同济、协和规培待遇
  4. 省培计算机实践作业,计算机软件基础强化实践能力培养实践部分考核作业.doc...
  5. C语言格式控制符/占位符 - C语言零基础入门教程
  6. BugkuCTF-WEB题需要管理员
  7. 如何占用计算机内存,电脑内存占用太高怎么办 教你电脑内存不够用解决方法...
  8. 怎么让PHP网页显示时有表格的效果,html的table用法(让网页的视觉效果显示出来)...
  9. 和氟西汀类似的备注_撒狗粮:可爱又霸气的给男朋友的微信备注
  10. linux默认的https端口,如何在Ubuntu 18.04 Bionic Beaver Linux上拒绝除HTTP端口80和HTTPS端口443之外的所有传入端口...