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) 分析程序来检测内存中的大额分配。

相关文章
|
4天前
|
缓存 安全 Java
Java并发编程进阶:深入理解Java内存模型
Java并发编程进阶:深入理解Java内存模型
14 0
|
3天前
|
存储 算法 Java
深入浅出Java内存管理
【8月更文挑战第28天】Java的内存管理是每个Java开发者都绕不过去的技术话题。本文将通过生动的比喻和直观的例子,带你走进Java内存管理的奇妙世界。我们将一起探索对象在Java虚拟机中的生命周期,了解栈与堆的区别,以及垃圾回收机制如何默默守护着我们的应用程序。准备好,我们即将启程!
26 14
|
3天前
|
监控 算法 Java
Java内存管理:垃圾收集器的工作原理与调优实践
在Java的世界里,内存管理是一块神秘的领域。它像是一位默默无闻的守护者,确保程序顺畅运行而不被无用对象所困扰。本文将带你一探究竟,了解垃圾收集器如何在后台无声地工作,以及如何通过调优来提升系统性能。让我们一起走进Java内存管理的迷宫,寻找提高应用性能的秘诀。
|
7天前
|
存储 Java 开发工具
【Azure 存储服务】Azure Blob上传大文件(600MB)出现内存溢出情况(Java SDK)
【Azure 存储服务】Azure Blob上传大文件(600MB)出现内存溢出情况(Java SDK)
|
1天前
|
Kubernetes Cloud Native Java
云原生之旅:从容器到微服务的演进之路Java 内存管理:垃圾收集器与性能调优
【8月更文挑战第30天】在数字化时代的浪潮中,企业如何乘风破浪?云原生技术提供了一个强有力的桨。本文将带你从容器技术的基石出发,探索微服务架构的奥秘,最终实现在云端自由翱翔的梦想。我们将一起见证代码如何转化为业务的翅膀,让你的应用在云海中高飞。
|
2天前
|
缓存 Java
Java内存管理秘籍:掌握强软弱幻四大引用,让代码效率翻倍!
【8月更文挑战第29天】在Java中,引用是连接对象与内存的桥梁,主要分为强引用、软引用、弱引用和幻象引用。强引用确保对象生命周期由引用控制,适用于普通对象;软引用在内存不足时可被回收,适合用于内存敏感的缓存;弱引用在无强引用时即可被回收,适用于弱关联如监听器列表;幻象引用需与引用队列配合使用,用于跟踪对象回收状态,适用于执行清理工作。合理使用不同类型的引用车可以提升程序性能和资源管理效率。
20 4
|
3天前
|
Java 编译器 开发者
深入浅出Java内存模型
【8月更文挑战第28天】Java内存模型(JMM)是理解Java并发编程不可或缺的一环。本文通过浅显易懂的方式,带你一探JMM的奥秘,从基本概念到工作原理,再到实际代码示例,逐步揭开Java内存模型的神秘面纱。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
|
4天前
|
存储 缓存 Java
Java内存模型(JMM)
Java内存模型(JMM)是一个抽象概念,用于规范程序中各种变量(实例字段、静态字段及数组元素)的访问方式,确保不同Java虚拟机(JVM)上的并发程序结果一致可靠。JMM定义了主存储器(所有线程共享)与工作存储器(线程私有)的概念,线程间通过主存储器进行通信。JMM具备三大特性:原子性(确保基本读写操作的不可分割)、可见性(确保一个线程对共享变量的修改对其他线程可见)、有序性(防止指令被处理器或编译器重排序影响程序逻辑)。通过这些特性,JMM解决了多线程环境下的数据一致性问题。
|
6天前
|
Java 容器
【Azure Function App】Java Function在运行中遇见内存不足的错误
【Azure Function App】Java Function在运行中遇见内存不足的错误
|
7天前
|
安全 Java 编译器
深入Java内存模型:解锁并发编程的秘密
【8月更文挑战第24天】在Java的世界,内存模型是支撑并发编程的基石。本文将深入浅出地探讨Java内存模型(JMM)的核心概念、工作原理及其对高效并发策略的影响。我们将通过实际代码示例,揭示如何利用JMM来设计高性能的并发应用,并避免常见的并发陷阱。无论你是Java新手还是资深开发者,这篇文章都将为你打开并发编程的新视角。
24 2

热门文章

最新文章

下一篇
云函数