8 种 Java- 内存溢出六 -Out of swap space?

简介: 8 种 Java- 内存溢出六 -Out of swap space?

6.1 Out of swap space? 概述

在启动时, Java 应用会分配有限的内存. 这个限制是通过 -Xmx 和其他类似的启动参数指定. 在这种场景: JVM 申请的总内存大于可用的物理内存, 操作系统开始把这些内存从内存 swap out 到硬盘(分配到 swap 区).

java.lang.OutOfMemoryError: Out of swap space?错误意味着 swap 区也耗尽, 新尝试的分配由于物理内存和 swap 区的不足而导致失败.

6.2 原因

当来自 native heap 的分配内存请求请求失败, 且 native heap 接近用尽, JVM 抛出java.lang.OutOfMemoryError: Out of swap space?. 这消息表明分配内存大小失败, 内存请求的原因.

该问题发生在这样的场景: Java 进程开始启用 swapping, 这已经不是一个好的情况了. 现在的 GC 策略很不错, 但是当面临由 swapping 引起的延迟问题, GC 暂停会增加到大部分应用都服务法接受的级别.

java.lang.OutOfMemoryError: Out of swap space?通常是由于操作系统层面的问题引起的, 例如:

  • 操作系统 swap 区空间配置不足
  • 系统上的另一个进程消耗了所有的内存资源

也有可能是因为 native 泄漏导致的应用失败, 例如, 如果应用或库代码持续消耗内存但是却不释放内存到操作系统.

6.3 解决方案

要克服这个问题, 你有几种方案. 首先, 最常用的而且是最容易的方案是增加 swap 区. 这与平台有关,例如在 Linux 中你可以使用下面的命令来实现,它创建并挂载一个新的 swapfile —— 大小为 640 mb。

swapoff -a
dd if=/dev/zero of=swapfile bs=1024 count=655360
mkswap swapfile
swapon swapfile
SHELL

现在,您应该回忆一下之前的内容,由于垃圾收集清除内存内容,一般来说,对于 Java 进程, 交换 (swapping) 是不受欢迎的。 在交换分配 (swapped allocations) 上运行垃圾收集算法会增加好几个数量级的 GC 暂停时间,所以在跳到这个简单解决方案的时候,你应该三思而后行。

如果您的应用程序部署在与需要竞争资源的“扰民恶邻”的 JVM 的旁边,那么您应该将服务隔离到独立的 (虚拟的) 机器上。

在许多情况下,您 唯一真正可行的替代方案是升级机器以包含更多内存 优化应用程序以减少其内存占用 。当您转向优化之路时,一个好的开始方法是使用内存转储(heap dump) 分析程序来检测内存中的大额分配。

相关文章
|
13天前
|
存储 Java 编译器
Java内存区域详解
Java内存区域详解
28 0
Java内存区域详解
|
23天前
|
缓存 算法 Java
Java内存管理与调优:释放应用潜能的关键
【4月更文挑战第2天】Java内存管理关乎性能与稳定性。理解JVM内存结构,如堆和栈,是优化基础。内存泄漏是常见问题,需谨慎管理对象生命周期,并使用工具如VisualVM检测。有效字符串处理、选择合适数据结构和算法能提升效率。垃圾回收自动回收内存,但策略调整影响性能,如选择不同类型的垃圾回收器。其他优化包括调整堆大小、使用对象池和缓存。掌握这些技巧,开发者能优化应用,提升系统性能。
|
19天前
|
缓存 安全 Java
Java并发编程进阶:深入理解Java内存模型
【4月更文挑战第6天】Java内存模型(JMM)是多线程编程的关键,定义了线程间共享变量读写的规则,确保数据一致性和可见性。主要包括原子性、可见性和有序性三大特性。Happens-Before原则规定操作顺序,内存屏障和锁则保障这些原则的实施。理解JMM和相关机制对于编写线程安全、高性能的Java并发程序至关重要。
|
1天前
|
Java 程序员 数据库连接
Java从入门到精通:3.3.2性能优化与调优——内存管理篇
Java从入门到精通:3.3.2性能优化与调优——内存管理篇
Java从入门到精通:3.3.2性能优化与调优——内存管理篇
|
1天前
|
存储 安全 Java
滚雪球学Java(19):JavaSE中的内存管理:你所不知道的秘密
【4月更文挑战第8天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
26 4
滚雪球学Java(19):JavaSE中的内存管理:你所不知道的秘密
|
9天前
|
存储 缓存 监控
Java内存管理:垃圾回收与内存泄漏
【4月更文挑战第16天】本文探讨了Java的内存管理机制,重点在于垃圾回收和内存泄漏。垃圾回收通过标记-清除过程回收无用对象,Java提供了多种GC类型,如Serial、Parallel、CMS和G1。内存泄漏导致内存无法释放,常见原因包括静态集合、监听器、内部类、未关闭资源和缓存。内存泄漏影响性能,可能导致应用崩溃。避免内存泄漏的策略包括代码审查、使用分析工具、合理设计和及时释放资源。理解这些原理对开发高性能Java应用至关重要。
|
17天前
|
存储 缓存 安全
【企业级理解】高效并发之Java内存模型
【企业级理解】高效并发之Java内存模型
|
21天前
|
存储 缓存 监控
深入解析linux内存指标:快速定位系统内存问题的有效技巧与实用方法(free、top、ps、vmstat、cachestat、cachetop、sar、swap、动态内存、cgroops、oom)
深入解析linux内存指标:快速定位系统内存问题的有效技巧与实用方法(free、top、ps、vmstat、cachestat、cachetop、sar、swap、动态内存、cgroops、oom)
|
23天前
|
Java
java中jar启动设置内存大小java -jar 设置堆栈内存大小
java中jar启动设置内存大小java -jar 设置堆栈内存大小
11 1
|
24天前
|
缓存 算法 Java
Java内存管理:优化性能和避免内存泄漏的关键技巧
综上所述,通过合适的数据结构选择、资源释放、对象复用、引用管理等技巧,可以优化Java程序的性能并避免内存泄漏问题。
26 5