Преимущество OpenJ9 для сериализации Java
Сериализация Java предоставляет способ легко преобразовать последовательность байтов в и из java.lang.Object.
Одним шагом, который происходит в процессе десериализации, является загрузка класса, указанного дескриптором класса, в поток байтов. Это включает в себя вызов двух методов, которые способствуют снижению производительности: java.lang.Class.forName, java.io.ObjectInputStream. latestUserDefinedLoader
Это частный метод, который находит последний определенный пользователем загрузчик классов или «LUDCL» для использования Class.forName. Если сначала получить доступ к ВМ, это означает, что безопасно исследовать структуры данных ВМ и пройтись по стеку. Затем он обходит стек, чтобы найти самое последнее — ClassLoader, что является дорогостоящим действием.
В OpenJ9 есть несколько оптимизаций
Кэширование классов: создайте, java.io.ClassCache, чтобы уменьшить количество вызовов java.lang.Class.forName для повторных поисков.
Кэширование «LUDCL»: загрузчик может быть безопасно кэширован в ObjectInputStreamклассе. Если пользовательские readObjectметоды вызываются во время этого процесса, LUDCL необходимо обновить.
Замена JIT ObjectInputStream.readObject: Чтобы исключить другое извлечение LUDCL, JIT заменит ObjectInputStream.readObject()вызов на ObjectInputStream.redirectedReadObject(ObjectInputStream iStream, Class caller). ObjectInputStream.redirectedReadObject предоставит информацию LUDCL через аргумент, предотвращающий дополнительные вызовы LUDCL.
Результаты производительности
С этими оптимизациями производительность приложений увеличивается на 4% .
Это свойство десериализации будет включено по умолчанию, начиная с выпуска OpenJ9 0.18.0 в январе 2020 года для всех версий Java.