有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

Java documentation says

Small utility applications that run only for a short time may suffer a performance hit if the JVM and Java application startup time is long.

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

编辑我认为投票结束这个问题的两个人甚至没有读过。JVM和JVM状态是两个不同的东西。我问过如何将JVM保存在内存中,而不是像另一个问题一样将JVM状态保存到文件中。前者的目标是节省启动时间。后者根本不能做到这一点


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

    … that run only for a short time may suffer … if … startup time is long.

    显然,这句话是如此的基本(真实但琐碎),以至于你可以把它应用到任何事情上,包括你的汽车或电视。回到打开电视意味着加热电视的时代,短时间看电视可能会受到长时间启动的影响

    在任何情况下,这句话都没有说存在这样的问题。因此,通过询问“是否有可能将JVM保留在内存中”,您不仅得出了存在这样一个问题的错误结论,而且暗示了这个问题(如果存在)是由JVM没有保留在内存中引起的,而不支持这个假设

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

    其他资源和应用程序的代码是使用常规I/O读入的,但操作系统层将利用未使用的内存进行缓冲。与内存映射库和共享类数据的区别在于,从已缓存的文件中读取数据时,需要执行必要的复制步骤。但是,当然,这仍然比实际从硬盘读取快

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

    您可能会认为第二次运行的启动时间与使用Hello World(例如脚本语言)相比仍然很高,但这不是保存或不保存JVM组件在内存中的问题。这也是高度主观的,启动时间要考虑足够长的时间来考虑应用程序遭受的痛苦。p>