根据top的说法,我们代码的内存使用率一直在上升,但当我观察visualvm时,它显示堆和元空间没有增长,并且GC正确,所以top和visualvm在内存使用率上存在分歧,而且在很大程度上太大了,不能仅仅由开销引起。
我们正在将许多“瓦片”加载到内存中,毫无疑问,这与无法关闭用于读取或存储它们的资源有关,这是我们的根本问题。问题是,看起来我们处理得很正确,我没有看到关闭或清理失败,代码中有足够的复杂性,我不确定该关注哪一个移动部分。
我运行过findbugs(是的,findbugs,因为我的公司希望我能够移山倒海,将spotbug下载到他们的基础设施中,为什么我们在编程时要使用最新的代码?)。它发现了很多错误,但没有一个是OS_OPEN_STREAM。所以findbugs显然认为关闭东西是正确的。尽管考虑到它的历史,我不确定它是否知道如何解析我们经常使用的较新的java8语法,所以也许我不应该相信这有多大意义。仍在努力在内部找到合适的斑点虫。
我还可以使用哪些工具来更好地了解哪些类未能清理?
编辑:
经过一些实验,我可以看到内存泄漏发生在共享内存中,根据pmap的说法,这似乎是由大量的300K nfs分配引起的。不确定这是否告诉了我什么我还不知道。