2

在大多数关于由终结器对象引起的内存泄漏的研究中,无论是在我们的代码中还是在依赖库中,都应该覆盖 finalize 方法。但在我的整个项目中,它无处使用。(我正在使用 Java8)

我正面临内存问题,对于我的服务,一旦我重新启动服务,可用内存就会开始减少,并且在 7 天内它会下降 95%,并且稍后会出现频繁的警告。

在此处输入图像描述 上图显示了 Y 轴上的可用内存,可以看到它减少了。上图中的所有峰值都用于重新启动服务。

当我通过 eclipse Mat 中的堆转储时,我看到以下内容:

在此处输入图像描述

可以看出,几乎所有空间仅由 1 个对象占用,即java.lang.ref.Finalizer,但是当我在项目中进行字段 Java 搜索时,我没有看到任何使用 finalize() 方法的代码。

我已经走到了死胡同,试图找到内存泄漏。是否有任何其他原因可能导致该问题。

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

0

IMO 的第一件事是尝试了解它的Finalizer来源 - 检查您的库并尝试发现它!也许他们甚至在他们的自述文件/文档中提到了一些东西?

在那之后,看看这个可以给你一些见解的答案/问题。此外,在我看来,这与 GC 有关。既然您提到了 java 8,您应该使用并行 GC(默认一个),这还不错,但您可以尝试使用它,更改 GC 并查看是否有任何其他选项更适合您。

于 2021-10-04T13:54:31.093 回答