Domanda

Sto usando jProfiler per trovare perdite di memoria in un'applicazione swing Java. Ho identificato le istanze di un JFrame che continua a crescere nel conto.

Questo frame viene aperto e quindi chiuso.

Usando jProfiler e visualizzando i Percorsi per GC Root c'è un solo riferimento, "Riferimento globale JNI".

Cosa significa? Perché è agganciato a ciascuna istanza del frame?

È stato utile?

Soluzione

Wikipedia ha una buona panoramica di Java Native Interface , essenzialmente consente la comunicazione tra Java e nativo librerie del sistema operativo scritte in altre lingue.

I riferimenti globali JNI sono soggetti a perdite di memoria, in quanto non vengono automaticamente raccolti in modo inutile e il programmatore deve esplicitamente liberarli. Se non stai scrivendo alcun codice JNI da solo, è possibile che la libreria che stai utilizzando abbia una perdita di memoria.

modifica qui sono un po 'più informazioni su riferimenti locali e globali e perché vengono usati i riferimenti globali (e come dovrebbero essere liberati)

Altri suggerimenti

Un riferimento globale JNI è un riferimento da " native " codice a un oggetto Java gestito dal Garbage Collector Java. Il suo scopo è impedire la raccolta di un oggetto che è ancora in uso dal codice nativo, ma non sembra avere riferimenti attivi nel codice Java.

Un JFrame è un java.awt.Window ed è associato a un "nativo" Oggetto finestra. Quando hai completamente finito con una particolare istanza di JFrame, dovresti richiamare il suo metodo dispose () per ripulire.

Non sono sicuro che qualche codice nativo stia creando un riferimento globale a JFrame, ma sembra probabile. In tal caso, ciò eviterà che JFrame venga raccolto. Se stai creando molte Windows (o sottoclassi) e stai vedendo che non vengono mai raccolte, assicurati che siano eliminate.

Ho riscontrato questo esatto problema durante la correzione delle perdite di memoria in un'applicazione JavaFX. Alla fine il problema si è rivelato che stavo eseguendo l'applicazione in modalità di debug e avevo diversi punti di interruzione nel codice. Ciò sembra aver causato che gli oggetti fossero "riferimenti globali JNI" e che fossero tenuti in memoria senza una ragione apparente. Quando ho disattivato la modalità di debug tutto ha funzionato come dovrebbe!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top