使 OpenJ9 类共享也共享非引导类
Posted
技术标签:
【中文标题】使 OpenJ9 类共享也共享非引导类【英文标题】:Make OpenJ9 class sharing also share non-boot classes 【发布时间】:2020-02-28 18:48:12 【问题描述】:我们在单个服务器(使用 Docker Compose)上运行数十个 Docker 容器(Metabase BI 工具,一个 Java 应用程序),并希望优化内存占用。
我通过提供以下 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 也共享所有应用程序类?
【问题讨论】:
【参考方案1】:只要您的应用程序类加载器扩展了 URLClassLoader,OpenJ9 就应该能够缓存由该类加载器加载的应用程序类。默认情况下,OpenJ9 仅在它检测到的启动期间缓存 AOT 代码,但如果您放弃 -Xquickstart 并改为使用 -Xtune:virtualized 运行,也会发生更多的 AOT 代码缓存(在整个运行期间,即启动后期间) .这可能会或可能不会帮助您的情况,但我想我会提到它。请让我知道情况如何。
【讨论】:
【参考方案2】:通过从 Java 11 升级到 13 解决。
【讨论】:
以上是关于使 OpenJ9 类共享也共享非引导类的主要内容,如果未能解决你的问题,请参考以下文章