使 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 类共享也共享非引导类的主要内容,如果未能解决你的问题,请参考以下文章

如何使 Node 和 React 应用程序共享类

Flutter 存储共享首选项中的自定义类列表

Kotlin/Native - 非法尝试访问非共享 <object>

在多个 WCF 服务之间共享类

享元模式

c++ boost进程间交换(复制)非共享和共享字符串向量