Em primeiro lugar, não especule, meça. Procure um bom profiler (o Netbeans já possui um) e veja quais são os métodos que são os reais gargalos de sua aplicação.
Otimize esses métodos. Algumas técnicas para melhorar a performance são:
- Use algoritmos mais eficientes.
- Faça cache de objetos (pode ser muito útil se evitar acessos ao BD ou ao disco), mas consome memória;
- Use lazy-loading para não concentrar o tempo de carga dos objetos;
- Procure reduzir o número de threads concorrentes ao mínimo possível.
Quanto a memória:
- Procure objetos que estão sendo criados, mas não estão sendo destruídos. É comum esquecer instâncias referenciadas em listas ou arrays, por exemplo.
- Maximize o compartilhamento de objetos imutáveis;
Otimização torna o código mais inflexível e mais ilegível, portanto, volto a frisar: otimize apenas nos pontos de gargalo de sua aplicação. No resto, priorize um código legível e bem estruturado.
Há um delicado trade-off na sua aplicação. Técnicas para otimização usam memória e ténicas para reduzir o uso de memória geralmente requerem processamento. Então, sempre que modificar, refaça o profiling e veja se a situação melhorou ou não.
Se não melhorou, desfaça a modificação, novamente dando preferência para um código legível ao invés de otimizado nos lugares onde isso não é um problema.