【问题标题】:JVM "strange" behaviourJVM“奇怪”行为
【发布时间】:2020-10-14 07:01:50
【问题描述】:

我遇到了一个在 Java8 上运行的 Alfresco 实例的“奇怪”行为。 应用程序有时会使用所有可用的 RAM 并导致 OOM 异常。 我们制作了一个 HeapDump 来查看发生了什么,以及制作转储的过程释放了已用内存的主要部分。 知道那里发生了什么吗?

每次我们执行转储时,内存都会被释放并在之后上升。 我无法理解这种行为背后的逻辑

【问题讨论】:

  • 似乎与此线程相关:stackoverflow.com/questions/5403161/…。我们应该强制 GC 还是换个方向?
  • 您确定您的应用程序不会使用这样的内存吗?您可能是上传非常大的文件还是根据某些条件创建数千/数百万个重类?
  • 应用程序可以使用大量内存,但为什么每次我们转储堆时,都会释放所有内存?据我了解,GC 会释放未引用的内存,这意味着应用程序不再需要内存。跟进我最初的问题,每次我们转储时,内存都会下降,然后又开始上升。这是什么意思?
  • 你是手动转储还是使用 java -XX:+HeapDumpOnOutOfMemoryError 自动转储?

标签: java out-of-memory alfresco


【解决方案1】:

当您尝试从 visualvm 获取堆转储时,首先:

  • 触发完整垃圾收集以清除“死”对象。通过在垃圾收集日志中搜索“Full GC (Heap Dump Initiated GC)”可以找到发生的情况。
  • 将剩余的“活动”对象转储到文件中。

这就是原因,每当您进行堆转储时,实际的堆利用率就会下降。这也表明,您在进行堆转储的环境中可能没有内存泄漏或其他通常会导致 OutOfMemory 的问题。

我建议使用以下 JVM 参数,这些参数非常有助于解决 OutOfMemory 错误:

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=C:\path_where_heap_dumps_will_be_generated
-XX:OnOutOfMemoryError=do_something_to_recover_from_it

详情请see this doc

【讨论】:

  • 我已经做到了。 OOM 不再发生。我们已经改变了我们在 Alfresco 中处理安全性的方式。情况有所好转,但记忆力仍然很尴尬
猜你喜欢
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2013-08-25
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多