是否可以在应用程序启动之间将JVM保留在内存中?

时间:2016-09-19 17:45:24

标签: java performance jvm

Java documentation says

  

仅在短时间内运行的小型实用程序应用程序可能会受到影响   如果JVM和Java应用程序启动时间很长,性能会受到影响。

我想知道在应用程序启动之间是否可以将JVM(不是“状态”)保留在内存中以避免启动延迟?

编辑我不认为投票结束这个问题的2个人甚至读过它。 JVM和JVM状态是两回事。我问过将JVM保留在内存中,而不是将JVM状态保存到文件,就像其他问题一样。前者的目标是节省启动时间。后者根本不这样做。

2 个答案:

答案 0 :(得分:1)

请注意,引用的句子只是条件(中间有“ if ”),省略技术术语,基本上说:

  

...只运行一小段时间可能会受到影响...如果...启动时间很长。

显然,这种陈述是如此根本(真实但微不足道),你可以把它应用到一切,包括你的汽车或电视。回到打开电视的时候暗示加热电子管,观看短片可能会受到启动时间长的影响。

在任何时候,这句话都说 就是这样的问题。所以你不仅通过询问“是否可以将JVM保留在内存中”来得出错误的结论,而是暗示这个问题(如果它存在的话)是由于JVM没有被保存在内存中引起的,没有任何支持这个假设。

“JVM”由几个组件组成。本机代码通常作为本机共享库提供,由操作系统加载并保存在内存中。 JRE的类存储在shared archive中,它将被内存映射,因此,在JVM实例之间共享并保存在内存中,类似于构成JVM的本机库,如果操作系统确定有足够的未使用的内存。

使用传统I / O读取其他资源和应用程序代码,但操作系统层仍将利用未使用的内存进行缓冲。内存映射库和共享类数据的不同之处在于,从已经缓存的文件读取时将有必要的复制步骤。但是,当然,这仍然比实际读取硬盘更快。

总而言之,“将JVM保留在内存中”已经是一个事实,关于那些可以保留和重用的部分,并且改进潜力很低。您可以通过在新启动的计算机上启动一个小应用程序(例如hello world)轻松验证它,然后使用相同的JVM再次运行相同的应用程序,您会发现第二次运行时启动时间显着缩短。

与使用的hello world相比,您可能会认为第二次运行的启动时间仍然很高。脚本语言,但这不是保持或不保持JVM组件在内存中的问题。它也是非常主观的,启动时间要考虑足够长的时间来考虑应用程序的痛苦。

答案 1 :(得分:0)

这取决于您希望如何使用JVM。如果上一个JVM作业完成且不需要任何数据,则可以将JVM重用于下一个或将来的作业。这已部署在大数据应用程序中以缩短JVM启动延迟(例如Hadoop或Spark),您可以参考this以获取更多信息。