据我所知,在linux系统中,缓存内存用于提高磁盘IO操作的性能,并且只要某些进程请求分配内存,它就会被释放。
但是最近,我得到了OOM(内存不足)导致我的java应用程序关闭,而缓存内存仍然可用(~250MB),而我现有的java应用程序java堆是Xms:128MB和Xmx:256MB。我捕获了 free -m 命令和内核错误
在这种情况下你有什么想法吗?任何帮助都会很好。谢谢
答案 0 :(得分:0)
您能否发布完整的错误消息和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)开始,然后向OS请求额外的内存,直到达到最大限制(Xmx)。 与此同时,垃圾收集器清理内存(使用多种方法,基于运行时条件,JVM版本,配置等)。 所以你应该重新审视你的逻辑并避免将太多的对象留在内存中,或者增加Xmx。 对于类/代码和其他内存池(与jvm实现不同)会发生类似的事情。
如果您遇到内存泄漏,可以使用http://www.eclipse.org/mat/或https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks001.html
分析已分配的内存