Acho que uma boa maneira de rastrear vazamentos de memória é anexar o VisualVM ao processo Java em execução (neste caso, uma instância do GF) e examinar a árvore de referência dos dumps de heap.
Outra maneira que me vem à mente, mas requer algum trabalho, seria escrever seu próprio wrapper de conexão / pool de conexão e registrar um rastreio de pilha sempre que a conexão for retirada do pool e também fechada.