Newsgroup: it.comp.java
Titolo: Problema con la memoria

Ciao a tutti,
sto cercando di creare un thread che prenda degli screen capture (tramite
Robot) in continuazione e ne estragga un array di int con i dati per ogni
pixel. Il
problema č che dopo 7 cicli va in OutOfMemory (senza stack trace
disponibilie) e si ferma. Ho giŕ provato ad aumentare lo stack size iniziale
(passando -Xmx128M all'interprete) ma nienete, stesso risultato.
Qualcuno puň aiutarmi?
Grazie, Leonardo.

> Qualcuno può aiutarmi?
Difficile dirlo senza aver prima dato un'occhiata al codice...
Marco.
--
Per scrivermi direttamente elimina
__TOGLIMI__ dall'indirizzo e-mail.

Giusto ! ecco il codice...
while(true) {
    d = Toolkit.getDefaultToolkit().getScreenSize();
    bi = robot.createScreenCapture(new Rectangle(0, 0, d.width, d.height));
    pixels = bi.getRGB(0, 0, d.width, d.height, null, 0, d.width);
    [...]
    bi.flush();
    System.gc();
   }
Spero sia di aiuto...



Se tu provassi ad usare qualche istruzione per interrompere il ciclo forse
avresti risolto i tuoi problemi di memoria.
-- 
La classifica dei prodotti MS:
C#, la migliore barzelletta di Bill Gates.
Visual C++, il meno standard dei compilatori C++.
J++, la copiatura più riuscita.
Windows, il più instabile.
Visual Basic, un esempio di prodotto decente della MS - forse l'unico -.
OutlookExpress, scandali su scandali.
La classifica degli "amici" coglioni:
Stefano Zanchi, il miglior lamer del mondo.
 

E' ovvio che dove ci sono le [...] ci sono ALTRE istruzioni che fanno ALTRE
cose tra cui uscire dal ciclo, mai sentito parlare di BREAK ?!? o di RETURN
?!?
Comunque il problema non è la lunghezza indefinita del ciclo, ma il
maneggiamento di quantità di dati così gradi (1152 * 768 punti è abbastanza
!).
Spero di ricevere risposte più effettive, grazie.


Il codice mi sembra corretto e, per quanto mi riguarda, gira perfettamente
(anche se il rate con cui vengono catturate le schermate è decisamente
basso.) Ho provato a monitorare la memoria inserendo nel ciclo le
istruzioni:
long freeMem = Runtime.getRuntime().freeMemory();
System.out.println("Free Memory: " + freeMem);
ma è praticamente costante. Forse il problema sta nella parte di codice che
non hai postato. Il consiglio che posso darti è di ridurre tutto all'osso
e quindi di riaggiungere man mano le istruzioni tenendo sotto controllo la
memoria. In questo modo dovresti riuscire ad isolare la porzione di codice
che causa problemi. Buon lavoro!


> Qualcuno puņ aiutarmi?
Aggiungo un'altra informazione che puņ esserti utile. La Tech Tip del 22
Dicembre 2000 su JDC tratta proprio di come tenere sott'occhio la gestione e
l'impiego della memoria da parte di una applicazione. Credo faccia al caso
tuo:
http://developer.java.sun.com/developer/JDCTechTips/


?!?
Certamente, anche di continue se solo per questo.
Chiedo scusa se sono stato un po' precipitoso e non volevo offendere
nessuno. Cmq si puň vedere il codice compreso tra [...]. Forse il problema
č proprio contenuto in queste istruzioni, dato che quelle da te postate
funzionano perfettamente.
A risentirci.
-- 
La classifica dei prodotti MS:
C#, la migliore barzelletta di Bill Gates.
Visual C++, il meno standard dei compilatori C++.
J++, la copiatura piů riuscita.
Windows, il piů instabile.


Ciao a tutti,
grazie per l'interessamento, chiedo scusa se mi sono scaldato...
Il frammento di codice che ho postato si è rivelato preciso per i miei
scopi,
ma ahimè ho dovuto cambiare jdk. Infatti con quello di IBM (versione 1.3)
tutto funziona benissimo, anzi meglio in generale. Vi consiglio di provarlo.
Grazie ancora, Leonardo.