Сделать совместное использование классов 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 также разделял все классы приложений?


person Andrey Ch    schedule 28.02.2020    source источник


Ответы (2)


Пока ваш загрузчик классов приложений расширяет URLClassLoader, OpenJ9 должен иметь возможность кэшировать классы приложений, загруженные этим загрузчиком классов. По умолчанию OpenJ9 кэширует код AOT только в период запуска, который он обнаруживает, но если вы отбросили -Xquickstart и вместо этого запустили -Xtune:virtualized, также произошло бы дополнительное кэширование кода AOT (на протяжении всего запуска, т.е. в период после запуска) . Это может помочь или не помочь вашему сценарию, но я подумал, что упомяну об этом. Пожалуйста, дайте мне знать, как это происходит.

person vijaysun    schedule 08.05.2020

Решено путем обновления с Java 11 до 13.

person Andrey Ch    schedule 29.02.2020