当内存在 ubuntu 中仍然可用时发生 Java 内存不足

标签 java ubuntu caching memory out-of-memory

据我所知,在 linux 系统中,缓存内存用于提高磁盘 IO 操作的性能,并且当某些进程请求分配内存时它会被释放。

但最近,我遇到 OOM(内存不足)导致我的 java 应用程序关闭,而缓存内存仍然可用(~ 250MB),我现有的 java 应用程序 java 堆是 Xms:128MB 和 Xmx:256MB。我捕获了 free -m 命令和内核错误

free -m command

kernel error

对于这种情况,你有什么想法吗?任何帮助都会很好。谢谢

最佳答案

能否请您发布完整的错误消息和 java 版本?

它应该包含一些对耗尽内存池(即堆、permgen 等)的描述,这有助于确定异常的原因。 操作系统级别的可用内存只是潜在原因之一(不是很频繁)。 参见 https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks002.html了解更多详情。

大多数情况下,OOM 不是由于操作系统级别的内存可用,只需避免向集合中添加一堆对象即可解决。

OutOfMemory 通常是由于 JVM(主要是堆)内的空间耗尽所致。 也就是说,对于 Xmx,您将堆限制为 256m:如果您保留对使用超过 256m 的对象的引用,您将耗尽堆空间并因此获得 OOM。与类或类加载泄漏的 permgen 类似。

堆是分配给 JVM 以托管对象的内存量,不应与操作系统内存混淆。 JVM 以一定的堆大小 (Xms) 开始,然后向操作系统请求额外的内存,直到达到最大限制 (Xmx)。 同时,垃圾收集器清理内存(有多种方法,基于运行时条件、JVM 版本、配置等)。 所以你应该重新审视你的逻辑并避免在内存中保留太多对象,或者增加 Xmx。 类/代码和其他内存池也会发生类似的情况(因 jvm 实现而异)。

如果您遇到内存泄漏,您可以使用 http://www.eclipse.org/mat/ 分析分配的内存或 https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks001.html

关于当内存在 ubuntu 中仍然可用时发生 Java 内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45914897/

相关文章:

java - 如果我在日期中将小时、分钟和秒设置为 0,则一天会减少 1..

java - 执行文本文件中给出的java代码

ruby - Gem 在 Ubuntu 14.04 上未安装 Jekyll : command not recognized

php - 对所有用户使用相同的 MySQL 查询,而无需重新连接到数据库

caching - REST 资源设计 : Embedding related data VS linking to it?

caching - Haskell 缓存函数结果

java - 为什么 Java Web Start 从 JBoss 重新下载 jar?

Java - 使用 ActionListener 调用 JasperReport

linux - rsync 在传输过程中以固定位置挂起

macos - 如何访问 Vagrant 虚拟机中运行的 Redis