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

标签 java performance 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(而不是它的“状态”)保留在内存中以避免启动延迟?

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

最佳答案

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

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

显然,此声明非常基础(真实但微不足道),您可以将其应用到任何事物,包括您的汽车或电视。回到打开电视意味着加热 pipe 的时代,看短片可能会因为启动时间长而受到影响。

在任何时候,该声明都不是说存在这样的问题。因此,您不仅得出了存在此类问题的错误结论,通过询问“是否有可能将 JVM 保留在内存中”,您暗示此问题(如果存在)是由 JVM 未保留在内存中引起的, 没有任何支持这一假设。

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

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

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

您可能认为与使用例如 hello world 相比,第二次运行的启动时间仍然很长一种脚本语言,但这不是在内存中保留或不保留 JVM 组件的问题。这也是非常主观的,考虑哪个启动时间足够长以考虑应用程序是否遭受它。

关于java - 是否可以在应用程序启动之间将 JVM 保留在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39579134/

相关文章:

java - 具有凭证安全性的 Spring token 安全性(spring boot)

java - DispatcherServlet 中的 PageNotFound : No mapping found for HTTP request with URI [. ./j_spring_security_check]

Javascript 原型(prototype)与 $.extend - 内存难题

c++ - 将小的重叠 block 合并为较大的连续 block 的有效算法?

mysql - 无法增加 innodb_buffer_pool_size 值

java - 在实践中,JVM如何收集SoftReferences?

java - 有没有办法在类的所有方法上设置断点?

java - 当我在当前 Activity 中按下按钮时如何更改下一个 Activity 背景

64 位 jvm 上的 Java 内存不足

java - 从 SBT 资源文件夹中读取文件而不转义字符