我们在一台服务器上运行了几十个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解决。