【发布时间】:2015-09-25 10:29:50
【问题描述】:
不是很了解 Java,尤其是 Java 中的调试,但是在 Jenkins 中使用 Monitoring 进行堆转储,然后在 Eclipse 中使用 MAT 对其进行解码,显示使用的总内存为 169.4 MB,而在 Jenkins 中监控内存似乎经常被大量使用,并且 GC 经常运行。 -XmX 是 4G。
为什么我只有 169.4 MB 的 MAT?可能是因为在进行转储之前 Jenkins 执行了 GC?如果是这样,我可以避免看到完整的内存转储吗?
【问题讨论】:
-
AFAIK 转储会在之前导致 gc,或者至少 MAT 会忽略可能被 gc 处理的内容。 Jenkins 可能会在之后有资格进行 gc 的工作期间加载大量数据。顺便说一句,你如何触发转储?它是 Jenkins 的内置功能还是您通过 JConsole 或类似的方式向 JVM 发送命令?
-
@Thomas 转储可以从监控插件触发。有一个按钮 - 我只能这么说 :) 来自 Jenkins GUI
-
在这种情况下,可能是插件停止了当前作业或等待它完成(或者当前作业加载了很多数据但不再需要)。 - 我只是在这里猜测,因为我不知道那个插件。但除此之外,您是否有频繁 GC 的问题?
-
@Thomas 我不这么认为。使用 4G 内存,GC 大约 30 秒执行一次,耗时 1 秒。我在加载页面/控制台日志时遇到问题,但不存在网络问题,Jenkins 日志什么也没说。任何地方都没有错误,只是页面加载缓慢。即使是主节点上的系统负载也很少会超过 1(运行 64 位 RHEL,具有 4 个内核和 24 G ram 以及其他 6 个使用较少内存的 Jenkins 实例)。
-
@Thomas 有人说 - 在收集转储之前执行 GC ......这不是有点不对吗?如果某些东西保留了太多内存,您将如何解决内存问题?它只是被清理了,所以人们永远不会发现......我会尝试找到一些控制台命令用于没有 GC 的堆转储。
标签: java memory jenkins dump heap-dump