通过向classes.jsa添加自己的应用程序类来加速应用程序启动

Dan*_*iel 32 java jvm startup jsa

为了加快JVM的启动时间,Sun开发人员决定在安装JVM期间为平台预编译标准运行时类是个好主意.这些预编译的类可以在以下位置找到:

$ JAVA_HOME\jre的\ BIN \客户端\ classes.jsa

我的公司目前开发了一个Java独立应用程序,它带来了自己的JRE,因此通过在这个jsa文件中添加我们自己的应用程序类来加速我们的应用程序启动时间是一个很棒的选择.

我不相信JSA文件是由魔术创建的,所以:它是如何创建的?如何欺骗JVM合并我自己的类?

编辑:我已经发现以下内容:

classes.jsa由命令创建

java -Xshare:dump
Run Code Online (Sandbox Code Playgroud)

可以在中找到要包含在转储中的类列表$JAVA_HOME/jre/lib/classlist.

我甚至设法在这里添加我自己的类(并将它们添加到rt.jar中以便java找到它们),并在classlist文件下面生成我自己的校验和.

最后一个问题是:只有java,com.sun和org.w3c包中的类似乎被识别,如果我在原始包中保留相同的类,它们将不会被加载.我在整个OpenJDK源代码中搜索了这个指针,但它似乎与保护域有关.如果有人对这个主题感兴趣并且知识渊博,请添加一些指示让我进一步调查.

Dan*_*ira 11

你几乎就在那里,你只需要几个步骤就能让它发挥作用.要将自己的类添加到clients.js,您需要执行以下步骤:

  1. 你的课程的合格名称(你拥有它)

  2. 这些类的类路径(你有它)

  3. 知道如何重新计算校验和(你有)

  4. 转储新文件,提供您现在使用Java类预编译的类的类路径.

  5. 运行该程序,提供与转储新classes.jsa相同的类路径

要提供类路径,您要将类添加到类列表中,请使用该-Xbootclasspath/a命令.当JVM搜索引导类所在的位置时,它将附加目录/ JAR.classes.jsa的默认空间非常小,如果需要改进它,可以使用-XX:SharedReadWriteSize-XX:SharedReadOnlySize命令.您的dump命令看起来与此类似:

java -Xshare:dump -Xbootclasspath/a:C:/myfiles/directoryA/;C:/myfiles/directoryB/;C:/myJars/myJar.jar;
Run Code Online (Sandbox Code Playgroud)

最后一步是正常运行java应用程序,重新开启共享模式.您还需要Xbootclasspath在转储时添加令人兴奋的内容.它看起来与此类似:

java myapp.java -Xshare:on -Xbootclasspath/a:C:/myfiles/directoryA/;C:/myfiles/directoryB/;C:/myJars/myJar.jar;
Run Code Online (Sandbox Code Playgroud)

现在,您放在类列表中的每个类都与在同一JVM中运行的其他实例共享.


Ben*_*Ben 11

从Java 8u40(和嵌入式Java 8u51)开始,Java现在支持应用程序类数据共享(AppCDS)(即您在共享存档中的类).在我们的嵌入式Java上,我们发现启动改进> 40%!对我们来说几乎没有工作非常棒......

https://blogs.oracle.com/thejavatutorials/entry/jdk_8u40_released


Cha*_*ins 8

有趣的想法.正如我读到的那样,它用于跨VM共享数据和加速类加载,而不是编译.我不确定你会得到多大的提升,但如果你在启动时已经有很大的延迟(尽管VM已经试图减轻这种情况),那么它可能值得一试.

至于自己尝试一下,看起来这个文件通常是在安装Sun VM时创建的,但你也可以控制它.有些详细信息在旧的Sun Java 5 类数据共享文档中(您可能已经看过了吗?).一些Sun Java 6文档也提到过几次,但是不要在文档中添加太多内容.它似乎最初是IBM VM功能.而且,为了继续链接转储,它解释了一下这篇文章中.

我个人对此并不了解,所以我不知道你怎么控制它.你可以重新生成它,但我认为你不打算将自定义内容放入其中.此外,即使您可以"欺骗"它,也可能违反某种类型的Sun/Oracle许可证(例如,您不能乱用rt.jar并重新分配).而且,所有这一切,我怀疑你会看到启动时间的严重改善,除非你的应用程序中有成千上万的课程?

(这不是一个真正的答案,我知道,但它太大了,不适合评论,我发现这个问题很有趣所以我调查了一下,并把链接放在这里以防万一有人发现相同的信息有用.)