据我所知,在linux系统中,缓存内存是为了提高磁盘IO操作的性能,每当一些进程请求分配内存时,它就会被释放。
但是最近,我得到了OOM(内存不足),导致我的java应用程序关闭,而缓存的内存仍然可用(~250MB),而我现有的java应用程序java堆是Xms:128MB和Xmx:256MB。我捕获了免费的-m命令和内核错误
你对这个案子有什么想法吗。任何帮助都很好。非常感谢。
你能发布完整的错误消息和java版本吗?
它应该包含一些耗尽内存池的描述(如堆、permgen等),有助于确定异常的原因。操作系统级别的可用内存只是潜在原因之一(不太常见)。有关详细信息,请参阅https://docs . Oracle . com/javase/8/docs/technotes/guides/trouble shooting/memleaks 002 . html。
大多数情况下,OOM不是由于OS级别的可用内存,可以通过避免向集合中添加一堆对象来解决。
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 分析分配的内存