Metodi per identificare e risolvere le perdite di memoria nella JVM [chiuso]

2

Poiché i dati vengono migrati tramite il livello oggetto, si è verificata una tendenza al rialzo lenta nell'utilizzo della memoria. Riesco a vedere l'attività gc periodica, ma la tendenza della memoria sale ancora lentamente. Al momento, per la mia applicazione, ho impostato l'heap iniziale e massimo a 14 GB in produzione, tuttavia, se potessimo aver bisogno di un set di dati di grandi dimensioni, la mia preoccupazione è che alla fine avremo raggiunto il limite e quindi l'applicazione rallenterà (cosa è successo) .

Quali sono alcuni modi efficaci e dimostrando strategie per aiutare a identificare e rimediare a una potenziale perdita di memoria in un processo Java in esecuzione?

    
posta Royboy1984 19.08.2013 - 10:59
fonte

2 risposte

5

Ci sono generalmente due modi per affrontare questo problema.

1.) Utilizzare un analizzatore del registro GC per l'analisi post mortem di un registro. Ci sono una serie di opzioni da gratuite per commerciale per queste.

Dovrai assicurarti che la JVM inizi con i flag -XX: + PrintGCDetails -XX: + PrintTenuringDistribution e -loggc: [nome del tuo log gc]

Quando analizzi il log, vuoi vedere cosa succede dopo i GC completi. Il consumo di memoria è tornato a un livello abbastanza piatto? In caso contrario, si ha una perdita di memoria possibile .

Se sta calando in modo soddisfacente, basta semplicemente avere un grosso problema con le dimensioni del set residente, aumentare le dimensioni dell'heap o dividere il lavoro in lotti.

2.) Avvia Visual VM (viene fornito con Java) e poi campiona l'utilizzo degli oggetti (profiler) Visual VM ti dice quante generazioni vivono gli oggetti. Perdite di memoria sospette tendono a vivere in tutti delle generazioni (cerca il numero grande, sarà la grande barra rossa in alto). In genere si tratta di una sorta di byte di classe Java base [] o String o altro, ma non è la perdita, la perdita è il codice che crea quelli e non lascia andare.

Quindi il prossimo passo è seguire il profilo del metodo fino al bit di codice che sta facendo la creazione e guardare al codice sorgente sul motivo per cui non stai rilasciando.

    
risposta data 19.08.2013 - 11:46
fonte
0
  • Ho usato BEA's JRockit inserisci la descrizione del link qui per trovare i punti di perdita di memoria nel programma Java.

  • Ora BEA è stato acquistato da Oracle, non so se JRockit è vivo o morto.

risposta data 22.08.2013 - 08:14
fonte

Leggi altre domande sui tag