为什么JVM启动缓慢?

Jeg*_*sch 54 java performance jvm startup

与CPython等其他运行时相比,究竟是什么让JVM(特别是Sun的实现)运行缓慢?我的印象是,无论是否需要,它主要与一大堆图书馆的装载有关,但这似乎不需要花费10年的时间来修复.

想想看,JVM的启动时间与Windows上的CLR相比如何?Mono的CLR怎么样?

更新:我特别关注Unix中常见的小型实用程序的用例.Java现在适合这种风格吗?无论Java发生什么样的启动开销,它是否会为每个Java进程加起来,或者开销只是真正体现在第一个进程中?

Naa*_*aff 20

这是维基百科在这个问题上所说的话(有一些参考文献).

似乎大部分时间都是从磁盘加载数据(类)(即启动时间是I/O限制).

  • CPU解压缩时间最短.实际上,stackoverflow本身使用压缩作为性能优化,压缩比解压缩大得多. (5认同)
  • @Seun一个jar文件使用zip压缩,没有必要为一个文件解压缩整个存档,每个条目(文件)都是独立于其他条目压缩的. (5认同)
  • 需要澄清的是:这不仅是(或可能是)大量的磁盘I / O,而是从jar(war,ears)(它们是zip存档)中查找类。提取需要占用CPU,但尤其是压缩时。 (3认同)
  • @Tom:解压缩2kb类文件的CPU时间:最小.解压缩30mb类文件以读取2kb类文件的CPU时间:显着. (2认同)
  • @DzmitryLazerka Zip存档以中央目录条目结束,该条目列出了条目名称及其偏移量.你跳到最后,阅读目录并跳转到你需要的条目. (2认同)

Ale*_*ndr 8

只是要注意一些解决方案:

有两种机制可以更快地启动JVM.第一个是类数据共享机制,自Java 6 Update 21以来一直受支持(仅限HotSpot客户端虚拟机,据我所知仅限于串行垃圾收集器)

要激活它,您需要设置-Xshare(在某些实现上:-Xshareclasses)JVM选项.

要了解有关该功能的更多信息,请访问: 类数据共享

第二种机制是Java Quick Starter.它允许在OS启动期间预加载类,请参阅: Java Quick Starter以获取更多详细信息.


jdi*_*tal 5

在我的机器上运行带有1.6(Java 6)客户端JVM的普通Java应用程序似乎是即时的.Sun已经尝试调整客户端JVM以实现更快的启动(并且客户端JVM是默认的),因此如果您不需要大量额外的jar文件,那么启动应该是快速的.

  • 无论条件如何,jvm仍然是启动速度最慢的虚拟机.您可以在某些等级的机器上以及特定尺寸的应用中找到它.但它的启动时间仍然相当缓慢. (3认同)