Практический разбор, почему Java-приложение может «течь» по памяти и тормозить: забытые слушатели (
addActionListener/
removeActionListener), вечные статические коллекции, незакрытые ресурсы (совет:
try-with-resources), анонимные/внутренние классы, удерживающие ссылки, и злоупотребление
System.gc(). Научимся читать логи GC (
-Xlog:gc*,
-XX:+PrintGCDetails), подбирать сборщик, строить кэши на
WeakHashMap, мониторить (
jvisualvm,
jconsole), анализировать heap dump, и правильно настраивать
-Xmx/
-Xms. В конце — реальные примеры утечек и их исправления.