Hibernate + Consumo de memória excessivo ao construir o SessionFactory

Pessoal, tenho o seguinte problema:

Contexto:

Tenho uma aplicação Java Web JSF + Hibernate atualmente com 134 classes mapeadas e 1525 atributos anotados - OK
Essa aplicação é dividida em módulos e cada módulo está agrupado em um .jar com classes de cada domínio de negócio (módulos).
Até ai tudo bem, tudo funcionando…

Estou migrando uma outra aplicação para essa mesma arquitetura, e criei um outro jar para essa aplicação.
Esse novo módulo agrupa um conjunto de 332 classes e 5127 atributos anotados. As classes foram criadas e anotadas e tudo certo.

Problema:

Agora tenho uma aplicação com 466 classes mapeadas, 6652 atributos anotados, sendo que 943 são relacionamentos OneToMany e 915 são coleções ManyToOne;
O volume de mapeamentos e anotações aumentou consideravelmente.

Isso está gerando um grande impacto, pois só para criar a SessionFactory tenho um consumo absurdo de memória pelo Hibernate.
A aplicação ficou muito mais lenta independente do volume de objetos manipulados, pois a memória está sendo ocupada toda pelo Hibernate.
Em momento algum essa memória é liberada pelo GC… só reiniciando o servidor de aplicação.

Pergunta:

Como faria para otimizar esse consumo de memória na inicialização ???

Obs 1: Esse consumo de memória independe da criação de qualquer instância de objeto. Ocorre simplesmente criando a SessionFactory pelo método annotationConfiguration.buildSessionFactory();

Obrigado !!!

Você cria apenas uma vez, quando é inicializado o sistema?

Olá leomello, a sessionfactory é criada uma única vez. O consumo de memória aumentou proporcionalmente ao volume de mapeamentos e anotações, mas é muito alto e tornaria a integração inviável.

Aramin,

Tenho uma aplicacao com GlassFish + JSF2 + JPA2 + Hibernate4 e estou passando pelo mesmo problema, pois a medida que estao aumentando as entidades, demora mais o deploy e gera consumo de memoria “de cara”, antes de qualquer usuario entrar no sistema. Voce descobriu alguma configuracao do Hibernate para otimizar o uso de memoria?

Olá Edilmar, desculpe-me pela demora na resposta. Bem, infelizmente não consegui resolver o problema de consumo excessivo de memória do hibernate ao carregar a sessionFactory com tantos mapeamentos. Tive que dividir mesmo a aplicação. Porém, durante a busca da solução, fiz alguns testes e criei a atribuição da sessionFactory por lib. A “solução” ficou até interessante, permitindo criar a união de vários databases (MySQL, SQLServer, Postegres) numa mesma aplicação. O maior problema foi tratar as coleções e atribuições de objetos entre essas Factories.