2

我们有几个使用 Tankui 的 java 服务包装器作为 Windows 服务运行的 java 应用程序。我们的客户在机器启动时(前 30 秒)遇到了可扩展性问题。

传统上,我们使用 jconsole/visualvm 来监控 Java 虚拟机的运行状况。但是这些工具对于在机器启动期间捕获 java.exe 性能并不是很好。

我用谷歌搜索了一个答案,我发现最好的搜索结果是一篇题为“测量 Java 虚拟机的启动时间”的论文,但他们求助于使用 JNI 调用来检测应用程序http://www.mii.lt/ olympiads_in_informatics/pdf/INFOL073.pdf。我们更喜欢侵入性较小的方法。

什么是能够在机器启动期间捕获 java.exe 统计信息(线程计数、堆使用等)的良好外部工具或技术?

@djmorton 要求定义可扩展性问题。问题是当应用程序监控 100 个系统对象时,一切都很好。但是当数据增加到 1,000 个系统对象时

  • 1,100 个 JVM 线程同时运行
  • 线程 X 在 Java 读写锁上持有写锁 C1 正忙于使用 Hibernate/c3p0/JDBC/MySQL 更新系统对象的一部分
  • 线程 Y 持有结构 P 的 JVM 对象内在锁,正在等待获取 Java 读写锁 C1 上的读锁,以使用 Hibernate/c3p0/JDBC/MySQL 从数据库中读取系统对象的另一部分
  • 线程 Z 正在等待获取结构 P 的 JVM 对象内在锁。
4

1 回答 1

0

我们最终在离线模式下使用了 JProfiler。JProfiler 允许您根据 JVM 启动设置触发器。JProfiler 让我们在 Java 服务启动期间获取各种 JVM 遥测数据,如线程计数、Java 锁争用、线程转储等。

我们必须解决一个 Windows 文件权限问题。JProfiler 想要创建一个临时文件,但在此环境中,JProfiler 使用 LocalSystem 帐户在 Windows 服务中运行。解决方法是临时将服务设置为以管理员身份运行。

于 2015-03-11T17:07:18.780 回答