Newsgroup: it.comp.java
Titolo: Memoria esaurita

Ho un programmino abbastanza complesso che, da quel che mi riguarda, itera
su numerosi elementi estratti da un sorgente (file) XML.
Se gli oggetti sono più di un certo tot, il programma si ferma con un
errore di "Out of memory".
Come posso verificare i punti dove la memoria viene allocata e mai
rilasciata?
Ho provato, nel ciclo principale del "Main", a richiamare il garbage
collector ad ogni ciclo. Il programma rallenta di parecchio ma mi sembra di
non vedere alcun vantaggio nell'occupazione di memoria.
Da questo deduco che c'è un ciclo da qualche parte che continua ad
istanziare oggetti...
Se può essere d'interesse:
====================
 DescribeClass dc = new DescribeClass();
  for (Iterator i = m.listNamedClasses(); i.hasNext();)
   {
    System.out.println(dc.describeClass("",
m.getOntClass(i.next().toString()), false));
    System.gc();
   }
====================
dc.describeClass() è un metodo ricorsivo (ma non supera mai la 4
ricorsione)
Grazie!
Alex.
-- 
___________________________________________________________
a p bertolini
(
www.webwarrior.org
)

 rilasciata?
Temo che non sia un problema di garbage collector e memoria non 
rilasciata. A sensazione credo che sia inutile richiamare continuamente 
il gc perchè, fintanto non è terminata tutta la ricorsione, non esistono 
i presupposti affinchè venga liberata memoria.
Credo che l'unica soluzione sia ottimizzare l'uso della memoria. 
Banalmente, se per scorrere l'XML utilizzi un dom, ti conviene popolarlo 
una volta e passarlo come parametro alla funzione ricorsiva. Inoltre il 
metodo describeClass mi sembra (dal pezzetto di codice) un tipico caso 
di metodo statico.

 di metodo statico.
Il metodo describeClass() non è dichiarato come statico. Tu cosa intendi?
Che dovrei renderlo statico?
Ciao e grazie per l'interesse!


 Che dovrei renderlo statico?
A mio avviso si. Non avresti bisogno di creare una istanza di 
DescribeClass (lo chiameresti sempre come DescribeClass.describeClass()).

Grazie!
Distruggendo e ricreando l'oggetto ad ogni ciclo non sortisce alcuna
miglioria, salvo che il ciclo rallenta sempre più visto che gc affanna
sempre di più a cercare memoria da liberare.
Per trasformare la classe in statica, aspetto un attimo... non è una cosa
semplice...


 semplice...
E temo che non sarà nemmeno la soluzione definitiva, forse dovrai 
pensare ad un refactoring (che non sarà affatto facile).

 i presupposti affinchè venga liberata memoria.
Vero, fintanto che non esce dal metodo, il gc, trova referenze attive
agli oggetti e quindi non libera la memoria.
Per forzare un deferenziamento degli oggetti, basta fare un oggetto=null.
Ricorda che il richiamo di System.gc() o System.getRuntime().gc() NON
vuol dire che il gc venga eseguito e che liberi memoria. Se leggi le
specifiche, troverai che il programmatore può RICHIEDERE l'esecuzione
del garbage collector, ma la JVM NON ASSICURA che ciò avvenga. Se anche
avviene, NON ASSICURA che liberi memoria.
Quindi non fare affidamento sul System.gc() per liberare memoria.
Riottimizza il codice, passando eventuali oggetti come paramtri, come ti
è già stato consigliato.
Oppure provare a rendere statici alcuni metodi, oppure, non so se è il
tuo caso, pesare ad un Singleton pattern.
Ciao D.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see 
http://www.gnupg.org
iD8DBQFAelAN4bZBbJz82hMRAj5XAJwJH1Q0SLOoq7Sr06oY8M82HUTPLwCeLgdp
AD8EyspZe7/IZZ3+jDgJ8Bg=
=ps6P
-----END PGP SIGNATURE-----