问题标签 [java-memory-leaks]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
634 浏览

android - LeakCanary 没有提供足够的信息来识别泄漏

我正在使用 LeakCanary,但堆分析结果没有提供足够的信息来检测任何泄漏。它只提到活动正在泄漏。

我从这条痕迹中所知道的SelectActivity只是泄漏。但我想不通为什么?活动本身有 1000 多行,我希望除了遍历每一行并检查可能的泄漏候选之外是否有任何捷径。

0 投票
1 回答
139 浏览

garbage-collection - jvm full gc 无法卸载类,即使 permgen 已满

我们的生产服务器出现 OOM,因为 permgen 已满。使用jmap -permstat检查 permgen 区域,我们发现有很多由com.sun.xml.ws.client.WSSServiceDelegatingLoader. 加载的类是com.sun.proxy.$ProxyXXX,其中XXX是一个 int 序列。 在此处输入图像描述

这些类加载的堆栈跟踪如下: 在此处输入图像描述

最终,JVM OOM,full gc 无法回收任何 permgen 内存。奇怪的是,如果我在 VisualVM 中单击 System GC,则会卸载类并且 permgen 的使用会下降。 在此处输入图像描述

我们的 JDK 版本是 1.7.0.80,我们添加了CMSClassUnloadingEnabled.

我们的代码已经运行了很长时间。最近的操作是一个 WebLogic 补丁。这真的让我很困惑。有人可以帮我解决这个问题,非常感谢!

0 投票
0 回答
34 浏览

java - 为什么来自 jcmd PID VM.native_memory 详细信息输出的 Java 堆部分远大于转储大小

我试图在带有嵌入式 tomcat 的 web spring boot 应用程序中找到内存泄漏。我执行jcmd PID GC.heap_dump /file.hprof并获得了大小约为 400Mb 的转储文件。我在 VisualVM 中打开该文件,它显示堆大小:393,958,104B。之后我执行jcmd PID VM.native_memory details并在输出文件中得到了关注

为什么差别这么大?

PS我知道jcmd PID GC.heap_dump默认情况下只检查活动对象,但我先运行它并执行jmap -dump:file=/afile.hprof PID以确保大小相同并执行 GC.run 几次,然后才运行jcmd PID VM.native_memory details

0 投票
0 回答
160 浏览

java - Java 对象在次要 gc 后不必要地提升到老年代导致内存碎片问题

我们的应用程序面临一个奇怪的内存泄漏问题。

GC 配置:ParNew + CMS

某些类型的对象过早升级为老年代并导致严重的碎片问题。

  1. 幸存者有足够的空间容纳这些物品
  2. 老化阈值为 15 个周期,并没有基于此发生过早升级。

关于这些对象:这些是使用 Java 辅助库创建的代理对象。

由于对此类对象进行了不必要的提升,老年代很快就被污染了,并且正在发生严重的碎片化。

我们的观察:

  1. 对象仅在伊甸园中分配。没有尺寸相关的问题。
  2. 对象的作用域非常小,可以在下一次次要 gc 中进行 GC。
  3. 为了确保这一点,我们在finalize()中打印了一些记录器,并观察到范围在请求后立即结束。就在第一次次要 GC 之后。

注意: finalize() 只是为了跟踪目的而添加的。即使没有 finalize() 旧代促销也会发生。

  1. 在一次次要 gc 之后:
  • 期望是该对象将被清除。
  • 但是该对象正在升级为老年代。在多个堆转储的帮助下,我们能够跟踪对象升级到老年代。
  1. 所有这些对象都在老一代中积累,并由老一代 GC 进行 GC。
  2. 此行为仅在生产服务器中可见,在测试环境中不可重现。

请建议如何进一步进行并解决此问题。

另一个有趣的更新:使用 G1GC,当使用 G1GC 时,对象会被正确清除。使用 finalize() 方法检查,在第一个循环之后,对象变得无法访问。在下一个小循环之后,对象不在那里。对于 G1GC,问题不存在。

0 投票
1 回答
174 浏览

java - Java 内存问题:Java.lang.ref.finalizer 对象

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

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

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

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

在此处输入图像描述

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

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

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

0 投票
0 回答
130 浏览

android - 由于 mLoadedApk,我的一项活动中存在内存泄漏。我用过 LeakCanary。但无法理解

InstagramActivity 是第一个 Activity,它将在启动画面后对用户可见。GetDataFromServer 是一个单例,我使用改造用于网络调用。

我无法理解泄漏日志中提到的 mLoadedApk 和 mReceivers。由于我在代码中没有声明引用变量。

0 投票
1 回答
45 浏览

java - TreeMap 需要多少内存细化收集?

TreeMap<Long, Long>用 1000 个(所有唯一的)键值对填充的集合需要多少内存?

是的,我可以只看内存转储,但需要详细了解原因:

  • Long= n 字节
  • Entry<Long, Long > = 2n 字节,因此 1000 个条目 = 2000n 字节
  • 树节点中的引用:k 字节,1 个节点有 2 个到子节点的链接,所以 2k 字节,
  • 等等

总计:X ?

0 投票
1 回答
43 浏览

java - 不存储新声明的对象会导致内存泄漏吗?

我的意思是通过帖子标题说的是 - 这样做:

我自己用 Java 和 JavaScript 等语言编写了这样的代码——声明一个新对象而不将其存储在变量中,只调用它的一个方法。这会导致内存泄漏吗?..或者对象是否在方法堆栈的末尾被清除/被Java垃圾收集器释放?

为了安全起见,我应该这样做吗?: