Вы на самом деле не "копируете банку" в JVM.Вы загружаете классы из него, и только те классы, которые необходимы.Теперь, если вам каким-то образом не удалось получить много файлов классов размером несколько МБ и порождать десятки этих процессов, это не должно быть большой проблемой.Вам гораздо лучше просто позволить каждому процессу JVM позаботиться о своих проблемах и упростить задачу.При запуске нескольких JVM есть большая вероятность, что у вас все равно будет какая-то оптимизация в фоновом режиме.Не стоит угадывать оптимизацию реализации.
Если по какой-то причине это действительно является абсолютным требованием, вас ждет сложная поездка.Единственное решение, которое я могу придумать, - написать собственный загрузчик классов, который каким-то образом использует разделяемую память.И это, скорее всего, будет связано с использованием нативного интерфейса Java, что заставит вас писать специфичный для платформы код.Возможно, есть какое-то доступное решение, но я не знаю ничего подобного.
И это все, если исходить из того, что вы должны порождать другие процессы Java.Я думаю, вам будет лучше найти способ, чтобы эти другие процессы выполнялись в отдельных потоках, а не в одном и том же Java-процессе.Утилиты параллелизма Java (в пакете java.util.concurrent
) сделали такие вещи более управляемыми.
Сама JVM HotSpot использует обмен данными класса в системном файле JAR, чтобы уменьшить объем памятии ускорить загрузку нескольких JVM.Возможно, исходный код может дать некоторые идеи.Но я думаю, что это должно быть абсолютно последним, чтобы попытаться решить любую проблему, которая у вас есть.Если вы не столкнулись с серьезными проблемами с памятью и действительно не нуждаетесь в нескольких процессах, вы пытаетесь оптимизировать то, от чего вам следует держаться подальше.