Java JVM 或 Eclipse 启动开销

Posted

技术标签:

【中文标题】Java JVM 或 Eclipse 启动开销【英文标题】:Java JVM or Eclipse Start-up Overhead 【发布时间】:2012-12-05 05:50:50 【问题描述】:

我有一个在 Eclipse (Indigo) 和 Javd 1.7x 下运行的网络线程应用程序。很长一段时间以来,我注意到应用程序的第一次运行导致前端和后端加载性能下降,例如,如果我要加载应用程序,然后用 100 个网络数据包击中它(使用测试工具)前几个反应非常不稳定,最后几个反应。 [编辑]无需卸载应用程序,只需再次运行测试工具,应用程序就可以正常运行。[结束编辑]

我决定尝试深入了解它并加载 VisualVM 1.3.5 来分析行为。 CPU 使用率在运行开始时有一个明显的峰值,从 10% 上升到 50% 以上。在峰值之后,一切看起来都正常,并且如上所述,后续运行在 CPU 利用率中没有领先的峰值,后续运行的配置文件与第一次运行的峰值之间的配置文件相同。似乎没有任何证据表明线程数导致它,但有小幅上升。堆空间从 100MB 增加到 200MB,但除此之外一切正常。

欢迎提出任何想法。

谢谢

【问题讨论】:

除非您发布代码并提出具体问题先生,否则我认为您不会得到任何有用的回复! 【参考方案1】:

第一次运行测试时系统性能不稳定是相当典型的。这是由于操作系统从磁盘读取库、JAR 文件和其他数据并将其存储在缓存中。第一次完成后,所有后续运行都会更快、更一致。

另外,请记住,JVM 在启动后也会变得更慢。由于其热点分析和即时编译,在 JVM 为您的特定工作负载优化字节码之前,代码需要运行一段时间。

【讨论】:

【参考方案2】:

这对于 OSGi 环境很典型,其中捆绑包可能会在首次访问捆绑包类或服务时延迟初始化。

您可以通过使用 -console -consolelog 参数启动 Eclipse 来确定您的场景是否属于这种情况。

当控制台打开并加载应用程序时,发出ss 命令并注意哪些包被标记为 LAZY。然后,运行您的测试,再次发出ss,并查看其中一个 LAZY 捆绑包现在是否已激活。如果是这样,您可以通过 configuration/config.ini 文件强制急切启动您的包。这也可以通过IStartup 扩展点来完成。

【讨论】:

我怀疑这是在正确的轨道上,但是添加 osgi.compatibility.eagerStart.LazyActivation 并没有帮助,并且有这么多标记为 > 的类使它变得困难。我注意到实际的 CPU 峰值似乎是一个加载导致 GC 周期的类。我相信,正是这个循环导致了不稳定的首次运行性能。

以上是关于Java JVM 或 Eclipse 启动开销的主要内容,如果未能解决你的问题,请参考以下文章

在执行Java命令或eclipse启动程序,提示报错’jvm.cfg无法找到’的解决办法

eclipse中,哪儿能设置jvm的启动参数

Eclipse jvm启动参数在哪设置

增加 Eclipse 的 JVM 最大堆大小

JAVA Eclipse 启动 Eclipse 弹出“Failed to load the JNI shared library jvm_dll”怎么办

Eclipse 不启动(Ubuntu):JVM 终止。退出代码=13