2017-08-28 40 views
1

据我所知,在linux系统中,为了提高磁盘IO操作的性能,它会在某些进程请求分配内存时被释放。但是最近,我得到了OOM(内存不足)导致关闭我的Java应用程序,同时缓存的内存仍然可用(〜250MB),而我现有的Java应用程序Java堆是Xms:128MB和Xmx:256MB。我拍摄的免费-m命令和内核错误Java当内存在ubuntu中仍然可用时出现内存不足

free -m command

kernel error

你有没有在这种情况下,任何想法。任何帮助都会很好。谢谢

回答

0

请问您可以发布完整的错误信息和java版本吗?

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

大多数情况下,OOM并非归因于操作系统级别的内存,只能避免向集合中添加一堆对象。

OutOfMemory通常是由于JVM中的空间耗尽(通常是堆)。 即使用Xmx,您将堆栈限制为256m:如果您保留超过256m的对象的引用,那么您将耗尽堆空间并因此获得OOM。与类或类加载泄漏类似的东西。

堆是指向JVM分配给主机对象的内存量,不应与OS内存混淆。 JVM以特定的堆大小(Xms)开始,然后向OS请求额外的内存,直到达到最大限制(Xmx)。与此同时,垃圾收集器清理内存(使用多种方法,基于运行时间条件,JVM版本,配置等)。因此,您应该重新审视自己的逻辑并避免将过多对象保留在内存中,或者增加Xmx。 类/代码和其他内存池发生类似的情况(随jvm实现而变化)。

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

+0

同意分析分配的内存。我可以添加“给java版本”,因为内存/ GC架构的变化 –

+0

@JacekCz肯定,添加 –