Ich habe eine Java-Anwendung rund um die Uhr, es hat eine Verbindung zu einem MySQL-Server und eine TimerTask (läuft Akka). Ich laufe auf OutOfMemoryError nach einer Woche oder weniger der Operation und der Heap-Dump zeigt eine LinkedHashMap mit mehr als 4 Millionen Strings, sie haben eine GC-Wurzel von java.io.DeleteOnExitHook mit 800 MB Heap.Speicherleck auf DeleteOnExitHook
Alle Saiten sind so etwas wie /tmp/jar_cachexxxx.tmp
Dieses Problem wurde in zwei Maschinen mit OpenJDK Runtime Environment konsistent ist (Build 1.8.0_101-b13). Der JDBC-Treiber ist der, der auf Maven "mysql-connector-java" Version 5.1.38 zur Verfügung gestellt wird, und ich verwende den Verbindungspool BoneCP, Version 0.8.0.
Jeder hat eine Idee über dieses Leck?
Update - 5/12/16
Das Problem wurde gelöst, nachdem wir den Compiler für das Projekt geändert haben. Wir haben festgestellt, dass der Eclipse-JAR-Creator das einzige ist, was eine Beziehung zum JAR-Cache hat. Nachdem wir das Projekt mit Maven kompiliert hatten, war das Speicherleck verschwunden.
Könnten Sie weitere Informationen geben, wie Sie den Zugriff auf die Datenbank und mit Akka? Rufen Sie Java.io.File.deleteOnExit() auf? Wie viele Strings hast du gesehen, die wie "/tmp/jar_cachexxxx.tmp" aussahen? Das könnte ein Ablenkungsmanöver sein. Selbst wenn es 1000s dieser Zeichenfolgen gibt, werden 800MB nicht berücksichtigt. Versuche nach anderen Saiten zu suchen. – joseph
Wie haben Sie festgestellt, dass _all_ die Strings wie "/tmp/jar_cachexxxx.tmp" aussehen? 800MB bedeutet, dass Sie etwa 800MB/30Bytes = 26.666.666 Strings benötigen, die so aussehen. – joseph