Ссылочная реализация JAXB имеет своего рода недокументированное системное свойство именно по этой причине:
-Dcom.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.fastBoot=true
или для старых версий до рефакторинга пакета:
-Dcom.sun.xml.bind.v2.runtime.JAXBContextImpl.fastBoot=true
Это дает JAXB команду пропустить дорогостоящий процесс предварительной кеширования различных рефлексивных мышц, необходимых для работы. Вместо этого он сделает все отражение, когда контекст будет использован. Это замедляет время выполнения, но значительно ускоряет инициализацию, особенно для большого числа классов.
Однако одна часть проблемы со скоростью неизбежна, и это тот факт, что JAXB должен загружать каждый из ваших классов, а загрузка классов идет медленно. Это очевидно, если вы создадите второй контекст сразу после первого с той же конфигурацией - вы увидите, что он намного, намного быстрее, уже загрузив классы.
Кроме того, вы говорите, что у вас есть несколько экземпляров JAXBContext, потому что у вас есть несколько контекстных путей. Вы поняли, что можете поместить несколько контекстных путей в один контекст? Вам просто нужно передать их все в виде строки, разделенной точкой с запятой, когда вы инициализируете контекст, например,
JaxbContext.newInstance("a.b.c:x.y.z");
загрузит контексты a.b.c
и x.y.z
. Впрочем, это, скорее всего, не повлияет на производительность.