【问题标题】:Java process stay in running state and consume CPUJava进程处于运行状态并消耗CPU
【发布时间】:2016-07-09 03:05:18
【问题描述】:

我有一个 jar 在 Ubuntu 服务器的后台运行。

在某个时刻,应用程序开始消耗过多的 CPU(400%)并且 4 个子进程停留在 R 状态:

HTOP state before/after problem

注意:问题不是因为使用量而产生的,它是在一定时间(3-4天)之后引起的。我们必须杀死 java 并重新运行它。

编辑添加 GC 日志:

我执行了 java -verbose:gc,这是我在重新启动应用程序和应用程序显示之前解释的问题之间得到的结果。

EDIT ADD OLD GEN 日志:

在第一个图中,x 轴不在第二个,因为日志没有给出 GC 完成时的时间戳。同样在底部的ScreenShot中,Visual GC在问题发生期间运行在Visual VM中。

Graph Line for the GC

这里是日志转储:

http://www.filedropper.com/threaddump2

【问题讨论】:

  • 请提供更多信息给我们,你有一些日志吗?
  • @Hector 我不知道我可以将哪些日志添加到我的应用程序中可能会有所帮助!

标签: java netty cpu ubuntu-server


【解决方案1】:

一个可能的原因(这是纯粹的猜测,因为我们没有任何信息可以继续)是 java 进程内存不足并开始执行背靠背的完整垃圾收集,这是 cpu 密集型的. 启用日志记录以确定您是否收到 OutOfMemory 错误,如果出现,请启用 gc 日志记录并尝试确定内存泄漏的来源。

查看您的图表后,如果 x 轴大于秒,我会说您肯定存在资源泄漏。如果您可以在最后阶段以更高的分辨率发布终身一代的行为,那将会很有趣。

好的,看着新的图表我有点惊讶。我无法将第一个图表的行为与新图表相协调。您似乎根本没有任何记忆问题。老一代和年轻一代基本上都是空置的。您有应用程序的日志吗?

新图表没有提供任何更有意义的信息,您可以考虑在应用程序失控时进行线程转储。使用jstack <pid> >> thread_dump.log

【讨论】:

  • 你说的是哪种日志?
  • 您通常有应用程序日志吗?你没有 server.log 或类似的东西吗?你在 std.err 上没有得到任何东西?
  • 我做我的应用程序日志并将“system.out.println”重定向到另一个日志文件。但是没有错误或异常。
猜你喜欢
  • 1970-01-01
  • 2014-11-26
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
相关资源
最近更新 更多