Java 分析 - 检测导致峰值的原因

Posted

技术标签:

【中文标题】Java 分析 - 检测导致峰值的原因【英文标题】:Java profiling - detect what causes a spike 【发布时间】:2013-01-24 14:01:45 【问题描述】:

我正在尝试检测导致部署在 Jboss 中的 Java struts 基础 Web 应用程序出现大量峰值的原因。我已经使用 Yourkit 和 visualVM 进行转储并分析了转储,但这些峰值是暂时的,并且在转储被采取时什么都没有。

问题是 - 有没有办法检测导致运行时峰值的原因?

【问题讨论】:

当您看到峰值时检查您的应用正在执行哪些操作.. 当 GC 运行时,有可能出现峰值。检查一下。 你指的是哪种尖峰? CPU 使用率? 堆内存峰值 - 这意味着正在创建大型对象或大量对象。 CPU没问题 【参考方案1】:

这里有几个想法:

检查您的请求日志,看看是否与峰值以及请求量或特定请求类型有任何关联。

在启用 GC 日志记录的情况下运行 JVM 并查找相关性。

在应用程序中启用调试级日志记录并查找相关性。 (请谨慎使用此选项,因为打开更多应用程序日志记录可能会改变性能特征。)

(在 Linux / Unix 上)运行 vmstat 和 iostat 并查找与额外磁盘活动或交换/分页的相关性。


如果您的对象创建率或非垃圾对象的数量/大小出现峰值,这很可能是由您的应用程序而不是 JVM 或操作系统引起的。很有可能是由于应用程序工作负载性质的短暂变化造成的;例如请求中出现峰值,或者有一些不寻常的请求涉及创建大量对象。关注请求和应用程序日志。

【讨论】:

这是一台 Windows 机器。是的,我想我可以在应用程序中打开更多日志记录,看看当时发生了什么。然而,该应用程序有几个页面和模块 - 所有这些都在同一时间使用。所以这样做有点乏味。我一直在寻找可以注入应用程序的工具,当某个线程尝试创建大量对象时可以记录该应用程序......或该行中的某些东西。说起来容易做起来难:(【参考方案2】:

由于垃圾收集很可能会导致此类问题,我建议使用以下命令行选项在 JVM 中启用垃圾收集日志记录:

-Xloggc:<path and filename to log to> -XX:+PrintGCDetails

【讨论】:

谢谢。抱歉,您的意思是打开这些功能会对 Live 应用的性能产生不利影响吗? @Soumya 不,如果不清楚,抱歉。尽管 GC 日志记录可能需要一些磁盘 IO,但我认为打开它们不会产生任何重大的性能问题。我改写了答案以更清楚。

以上是关于Java 分析 - 检测导致峰值的原因的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 峰值检测加速框架

leetcode-峰值检测

如何检测时间序列中的峰值

加速度计数据中的峰值检测

音频信号中的峰值检测

python Python中的峰值检测