Cosa posso fare per scoprire che cosa sta causando il mio programma di utilizzare grandi quantità di memoria nel tempo?

StackOverflow https://stackoverflow.com/questions/4395296

  •  10-10-2019
  •  | 
  •  

Domanda

Ho un'applicazione che utilizza il POE che ha circa 10 sedute che fanno vari compiti. Nel corso del tempo, l'applicazione inizia a consumare sempre di più RAM e questo utilizzo non va giù, anche se l'applicazione è inattivo l'80% del tempo. La mia unica soluzione al momento è quella di riavviare il processo spesso.

Non mi è permesso di inviare il mio codice qui così mi rendo conto che è difficile ottenere aiuto, ma forse qualcuno può dirmi cosa posso fare scoprire me stesso?

È stato utile?

Soluzione

Non aspettatevi la dimensione processo per diminuire. La memoria non viene rilasciato torna al sistema operativo fino a quando il processo termina.

Detto questo, potreste avere cicli di riferimento a strutture di dati da qualche parte? AFAIK, il Perl garbage collector non può risolvere loop di riferimento.

Stai usando i moduli XS da qualche parte? Ci potrebbero essere perdite nascoste dentro quelli.

Altri suggerimenti

A indovinare: il programma esegue un ciclo per tutto il tempo in quanto è in esecuzione; in questo ciclo può essere che si alloca memoria per un buffer (o più) ogni volta che si verifica una certa condizione; dal momento che il campo di applicazione non è mai uscito, la memoria resta e non sarà mai ripulita. Vi suggerisco di controllare per qualcosa di simile. Se è il caso, inserire il codice allocare in un sub che si chiama dal loop e dove andrà fuori portata, e ottenere ripulito, al ritorno nel circuito.

appare come Test :: Valgrind è uno strumento per la ricerca di perdite di memoria. Non ho mai usato io stesso però (ma ho usato valgrind pianura con C source).

Una tecnica è quella di scaricare periodicamente il contenuto di $ POE :: :: Kernel poe_kernel in un file di tempo o sequenza di nome. $ Poe_kernel è la radice di un albero di copertura tutte le sessioni noti e il contenuto dei loro cumuli. Le istantanee dovrebbero monotona crescere se la memoria persa viene fatto riferimento. Sarete in grado di scoprire che cosa è fuoriuscita dal diff'ing uno snapshot iniziale con una successiva.

È possibile esportare POE_ASSERT_DATA = 1 per consentire controlli di coerenza dei dati interni di Poe. Non mi aspetto che i problemi di superficie, ma se lo fa sarei molto felice di ricevere una segnalazione di bug.

Perl non può risolvere gli anelli di riferimento. O si hanno gli zombie (che si può rilevare tramite ps Axl) o si dispone di una perdita di memoria (anelli di riferimento / cerchio)

Ci sono un sacco di programmi per rilevare perdite di memoria. strace, mtrace, Devel :: :: LeakTrace veloce, Devel :: ciclo

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