Manuseio de objetos de cache

Prezados, eu possuo um objeto de controle que através de um DAO realiza consultas muito extensas.
Entendam consultas extensas, muitas consultas a tabelas distintas que trazem muitos registros.

Para dar agilidade criei um objeto de cache, no qual no início das atividades do controle, ele faz a carga de todas as consultas necessárias para as funcionalidades do mesmo.
Ou seja, guardo tudo que preciso em memória um única vez, evitando assim consultas repetidas ou N consultas que podem ser obtidas através de uma única.

Eu hoje, envio este objeto de cache para os métodos do meu controle através de parâmetros.

Bem, tendo em vista que não é correto a utilização de variáveis globais de um objeto de controle, e que a utilização de um singleton faria com que este objeto de cache permanesse infinitamente na memória do meu servidor, alguém poderia me informar se existe alguma maneira melhor dos meus métodos enchergarem este objeto de cache ?

Não vejo problema de você passar este dado, já que faz parte do negocio. Apenas tendo o cuidado de encapsular direito isto numa entidade/interface bem definida.
Mas voce pode usar java.lang.ThreadLocal pra garantir manter atributos por execução corrente, só atente pra evitar introduzir pontos de falha