生产中的性能分析
如果您在Java应用程序的性能方面遇到了一些严重问题,那么很可能您会知道线程分析的价值。 但是您知道应该使用哪个分析器吗?
探查器使用两种基本技术-采样和仪器。
采样分析器
采样探查器包括定期向JVM询问所有当前活动线程的当前执行点。 这种类型的探查器具有最少的开销。 这很重要,因为在应用程序中进行大量测量会大大改变性能特征。 使用采样技术,当计时器触发时,我们将获得下一个堆栈跟踪的快照。 因此,探查器将查看每个线程,并确定该线程当时正在执行哪种方法。 由于连续测量之间存在间隙,因此采样探查器可以在获得的准确度与实际进行测量所涉及的开销之间进行权衡,如下图所示:
如您所见,线程大部分时间都用在save方法上,而一点点用在read方法上。 如果仅在线程处于save方法中时才进行采样(此方法更可能占主导),则探查器将报告该线程将其100%的时间花费在save方法中,这当然是不准确的。
最小化此采样误差的一种合乎逻辑的方法是减少采样之间的时间间隔并增加分析时间。 但是,正如我们前面讨论的那样,此解决方案可能会影响应用程序的性能特征,因此,平衡是关键。
仪器轮廓仪
仪器化的探查器为应用程序带来了更大的性能开销。 此方法通常涉及将字节码注入到类中以进行概要分析。 与采样分析器的结果相比,此方法会带来更高的性能影响,但会产生更准确的测量结果。 以下是仪器分析器修改字节码的方式可能引起的另一个问题: 如您所知, JIT编译器可以内联小的方法 。 由于探查器引入了仪器,因此某些小型方法可能不再适合内联。 它可能会对应用程序性能产生严重影响。 如果决定使用检测分析器,请确保仅检测代码的一小部分。
生产轮廓仪
在开发环境中进行分析很容易。 但是,这可能还不够。 在处理生产数据时,我们面临不同的规模,因此,在应用程序中可能会遇到不同的瓶颈。 这就是为什么在生产中进行概要分析如此重要的原因。 如前所述,采样轮廓分析仪和仪器轮廓分析仪各有利弊。 如果要在生产环境中进行分析,则低开销的采样分析器似乎是更好的选择。 有许多可用的采样分析器,例如async-profiler,JProfiler,YourKit,VisualVM Profiler和FusionReactor的 Production Code Profiler 。 FusionReactor的探查器的真正酷之处在于,可以对其进行配置,使其在检测到长时间运行的请求或线程时自动对您的应用程序进行探查。 什么是长期运行的请求? 您可以自行定义,但默认值为3秒。 如果监视某种对延迟敏感的应用程序,则可能需要减小此值。 同样,如果您的应用程序执行一些耗时的计算,则很可能您不想一直收到通知,因此有必要增加“ 最小事务处理时间” 。
在正在运行的应用程序中查明性能问题并不总是那么容易,但是探查器通常是一个不错的起点。
翻译自: https://www.javacodegeeks.com/2018/03/profiling-in-production.html