GC是否有任何理由“减慢”当前执行,即使GC日志显示它没有?

时间:2017-06-05 12:28:00

标签: java performance memory-leaks garbage-collection jvm

以下是我的java程序的说明:

  
    

这是一种在线程中运行数小时的优化算法     经常被服务中断以查询有关的内容     目前的优化。

  
     

优化例程是一系列简单的操作(让我们来看看)   称之为“移动”),一遍又一遍地重复。有时,   优化程序将放慢很多:一般采取行动   不到100毫秒,有时甚至需要几秒钟   分钟。

当然我考虑GC在执行完整GC时冻结执行,所以我做了一些实验,根据GC日志,次要收集非常定期完成并需要10ms,而完整的GC非常罕见,不超过2秒。我还通过GC日志分析工具进行了一些分析,吞吐量达到95%以上。例如,根据GC日志,在7分钟的测试运行中,由于GC而仅损失2到3秒。

应该得出结论GC不是问题。但是,我观察到尝试其他GC算法会对“最差”动作需要多长时间产生巨大影响(它可以使“动作”开始减速时的执行时间加倍/三倍)。因此,GC似乎对它有影响,即使GC日志告诉我GC没有花时间。

此外,我还观察到“移动”往往会按顺序减速:当一个移动速度减慢时,下一个移动减速的机会也更大,即使它们与这些操作没有任何关联是完全独立的。感觉整个系统在某些时候都在减速,特别是当服务被大量调用时。

我读了一些关于堆空间内存碎片的事情,可能会导致应用程序出现大幅​​减速,而且我的动作是创建和销毁很多对象,这可以解释我在这里遇到的问题。但是,我不明白为什么GC日志没有显示这个。

我真的达到了我的知识和经验的极限,我会采取任何直觉或线索,你可能需要进一步调查。

Heapspace profile while running the test

1 个答案:

答案 0 :(得分:0)

另一种解释是,减速的原因不在Java应用程序中。

  • 可能是由于与其他进程的CPU周期竞争。
  • 可能是由于内存竞争(导致分页)。
  • 如果您在虚拟机中运行,资源竞争可能在不同的VM之间。

或者,在您的应用程序中可能会出现一些意外行为:

  • 您使用的是WeakReference还是SoftReference个对象。
  • 您使用finalize()方法吗?
  • 您是否尝试过分析应用程序?

我建议您尝试使用操作系统提供的性能工具来查看系统上是否存在与暂停相关的其他活动。另外,查找系统本身的减速/暂停。