为了加快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源代码中搜索了这个指针,但它似乎与保护域有关.如果有人对这个主题感兴趣并且知识渊博,请添加一些指示让我进一步调查.
在我们在Jdk 8上运行的应用程序中,我们使用VisualVM来跟踪加载类的使用情况和元空间的使用情况.
在我们的应用程序运行的某个时间点,我们看到加载的类的数量不再增加,但是在我们的程序运行时,元空间的大小仍然增加.那么除了类之外还有哪些东西存储在元空间中,这可能会导致这种情况呢?