使OpenJ9类共享也共享非启动类



我们在一台服务器上运行了几十个Docker容器(Metabase BI工具,一个Java应用程序((使用Docker Compose(,并希望优化内存占用。

我通过提供以下Java选项启用了类共享:

-Xquickstart -Xshareclasses:cacheDir=/cache,verbose,checkURLTimestamps,persistent -Xscmx300M

但我只能让Java共享自己的库代码:

root@f7dc95f540cf:/# java -Xshareclasses:cacheDir=/cache,printStats=classpath
1: 0x00007F5ACE807F1C CLASSPATH
/opt/java/openjdk/lib/modules
Current statistics for cache "sharedcc_root": 
Cache created with:
-Xnolinenumbers                      = false
BCI Enabled                          = true
Restrict Classpaths                  = false
Feature                              = cr

有没有办法让OpenJ9也共享所有的应用程序类?

只要应用程序类加载器扩展了URLClassLoader,OpenJ9就应该能够缓存该类加载器加载的应用程序类。默认情况下,OpenJ9只在检测到的启动期间缓存AOT代码,但如果您放弃-Xquickstart并使用-Xtune:virtualized运行,也会发生更多的AOT代码缓存(在整个运行期间,即启动后期间(。这可能对你的情况有帮助,也可能没有帮助,但我想我会提到它。请告诉我进展如何。

通过从Java 11升级到13解决。

最新更新