Java 总承包商是否有任何理由;“慢”;当前执行,即使GC日志显示它没有';T

Java 总承包商是否有任何理由;“慢”;当前执行,即使GC日志显示它没有';T,java,performance,memory-leaks,garbage-collection,jvm,Java,Performance,Memory Leaks,Garbage Collection,Jvm,以下是我的java程序的说明: 这是一种在线程中运行数小时的优化算法 经常被服务中断,以查询有关 当前优化 优化例程是一系列简单的操作(让我们 称之为“动作”),反复重复。有时 优化过程将大大降低速度:一个移动通常需要 不到100毫秒,有时甚至需要几秒钟 分钟 当然,我在执行完全GC时考虑了GC冻结执行,所以我做了一些实验,根据GC日志,小收集非常有规律,需要10毫秒,而完全GC非常罕见,只需要2秒钟。我还通过GC日志分析工具进行了一些分析,吞吐量达到了95%以上。例如,在7分钟的测试运行中,根

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

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

优化例程是一系列简单的操作(让我们 称之为“动作”),反复重复。有时 优化过程将大大降低速度:一个移动通常需要 不到100毫秒,有时甚至需要几秒钟 分钟

当然,我在执行完全GC时考虑了GC冻结执行,所以我做了一些实验,根据GC日志,小收集非常有规律,需要10毫秒,而完全GC非常罕见,只需要2秒钟。我还通过GC日志分析工具进行了一些分析,吞吐量达到了95%以上。例如,在7分钟的测试运行中,根据GC日志,由于GC,只有2到3秒的时间损失

我们应该得出结论,GC不是这里的问题。然而,我观察到,尝试其他GC算法会对“最差”移动所需的时间产生很大影响(当“移动”开始变慢时,它的执行时间会增加一倍/三倍)。因此,GC似乎对它有影响,即使GC日志告诉我GC并没有花费时间

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

我读了一些关于heapspace内存碎片的内容,这些内容可能会导致应用程序的主要速度减慢,而且由于我的移动正在创建和销毁许多对象,这可以解释我在这里的经历。然而,我不明白GC日志为什么不显示这一点

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


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

  • 这可能是由于与其他进程争夺CPU周期造成的
  • 这可能是由于内存竞争(导致分页)
  • 如果您在虚拟机中运行,资源竞争可能在不同的虚拟机之间进行
或者,它可能是应用程序中的某些意外行为:

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

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

性能是一大难题。您还需要查看JVM周围的一切,而不仅仅是GC。当你说你感觉“慢”的时候,你能把从请求到响应的时间分解一下吗?什么是网络时间?处理时间?堆使用率,最重要的是CPU%。经常强调测试,测试的是硬件而不是软件。当CPU利用率低于80%时,Java表现良好。请提供更多的统计数据,我很高兴进一步讨论。所有数据都在同一台计算机上本地运行。CPU保持在50%以下,具体取决于机器。真正减慢速度的是“移动”操作。移动会创建项目的副本(.clone()),对其应用修改(称为“移动”),并将其添加到具有有限大小(先进先出)的堆栈中。移动通常需要10到100毫秒,这取决于移动速度,当移动速度减慢时,可以持续1到1分钟(在最坏的情况下是10分钟)。堆大小是多少?您可以发布您的运行时参数吗?-verbose:gc-XX:+PrintGCDetails-XX:+PrintGCApplicationStoppedTime-XX:+PrintGCTimeStamps-Xloggc:C:/temp/gc.log-Xmx3gOk,因此您的JVM正在使用CMS gc。运行测试时,您看到堆增加了吗?年轻一代的空间变化很大吗?使用CMS的缺点是,当堆建立起来时,完整的GC将需要更长的时间来运行。您是否尝试过使用其他GC?就像ParalleldGC和paralledGC?嗨,我既没有明确地使用WeakReference,也没有明确地使用SoftReference(我实际上是在你的帖子中发现的)。如果可以的话,我会尽量避免在循环中创建对象。我不使用finalize()方法。“分析”应用程序是什么意思?我经常使用jvisualvm,以及GC日志分析器,我在应用程序中记录了很多统计数据,以确定减速:这就是为什么我相信它们会发生在“移动”中的原因,移动的复杂性有限,没有理由花费超过几毫秒的时间,这就要求全球应用程序的速度有所放缓。@CédricHervet别忘了分页,这是一个常见的罪魁祸首。我不会费心减少对象创建,至少现在不会,因为一切都表明GC不是问题所在。尝试一个工具(Linux上的“top”,W上的任务管理器),它可以显示进程行为。你在做什么事情吗?有一些同步吗?嗨,你说的“分页”是什么意思?分页:。虚拟内存: