【发布时间】:2015-05-12 09:54:49
【问题描述】:
我们有几个使用 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 个系统对象时,一切都很好。但是当数据增加到 1000 个系统对象时
- 1100 个 JVM 线程并发运行
- 线程 X 在 Java 读写锁上持有写锁 C1 正忙于使用 Hibernate/c3p0/JDBC/MySQL 更新系统对象的一部分
- 线程 Y 持有结构 P 的 JVM 对象内在锁,正在等待获取 Java 读写锁 C1 上的读锁以使用 Hibernate/c3p0/JDBC/MySQL 从数据库中读取系统对象的另一部分
- 线程 Z 正在等待获取结构 P 的 JVM 对象内在锁。
【问题讨论】:
-
您看到什么样的可扩展性问题?请记住,由于 Java 的动态本机编译特性,Java 虚拟机需要一些时间来“预热”,在此期间执行的代码路径将被监视,并最终编译为本机代码。在此之前,整体性能可能会受到影响。
-
你使用的是客户端JVM的服务器吗?服务器风格经过优化,可随着时间的推移获得更快的速度,但启动速度较慢,而客户端则经过优化,可实现最快的启动。
标签: java scalability startup performance-testing java-service-wrapper