据我所知,在 linux 系统中,缓存内存用于提高磁盘 IO 操作的性能,并且当某些进程请求分配内存时它会被释放。
但最近,我遇到 OOM(内存不足)导致我的 java 应用程序关闭,而缓存内存仍然可用(~ 250MB),我现有的 java 应用程序 java 堆是 Xms:128MB 和 Xmx:256MB。我捕获了 free -m 命令和内核错误
对于这种情况,你有什么想法吗?任何帮助都会很好。谢谢
最佳答案
能否请您发布完整的错误消息和 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/