Newsgroup: it.comp.java
Titolo: Java.exe mangia memoria

Ciao
ho scritto un'applicazione che riceve ciclicamente (ogni tot secondi tramite
un thread) una discreta mole di dati da rete Ethernet e la scrive su una
memoria schematizzata su un Vector. Ogni tot secondi (temporizzato tramite
un Timer e TimerTask) questi dati vengono letti dal Vector ed usati per
aggiornare i valori di numerose Label.
Durante il funzionamento dell'applicazione l'occupazione di ram di Java.exe
cresce costantemente e dopo un pò di tempo il pc rallenta notevolmente.
Quale può essere il problema visto che non durante il funzionamento credo di
non creare o distruggere nessun oggetto??
Qualche idea??
Grazie
Ciao
Sebi

 non creare o distruggere nessun oggetto??
che ??
--
Davide Consonni
(
davidec...@virgilio.it
)

 ha scritto nel messaggio
news:al55op$1n9bhs$1...@ID-52945.news.dfncis.de...

ma i dati che metti nel Vector vengono sovrascritti o aggiunti sempre ?


vengono sempre sovrascritti.


e non fate gli schizzinosi!! :)
mi è scappato un "non" di troppo!
Ciao


Che struttura utilizzi per memorizzare i dati nel vector?
Non avendo a disposizione il sorgente del tuo listato presumo che tu
utilizzi Vector memorizzando in ogni posizione il buffer utilizzato per la
lettura da socket (wrapper, array o stringa) e resetti il Vector ad ogni
scarico.
L'implementazione di Vector i basa un array interno: quando la capacità
(fissa) di questo array viene superata, Vector ne crea uno nuovo di
dimensione doppia, copia il contenuto e scarta il precedente. Quando un
Vector viene resettato o azzerato, l'array interno viene creato con
dimensione 16 di default.
Il problema (sempre che io abbia azzeccato l'implementazione) può essere
dovuto quindi a diversi fattori:
1) eccessiva creazione dei buffer temporanei
2) trashing dovuto al continuo crescere dell'array interno dell'oggetto
Vector
3) utilizzo di Hotspot in modalità client (la server è più adatta ad un'alta
volatilità degli oggetti)
4) carico eccessivo(comprende i precedenti): il rallentamento è dovuto
all'attività di gc che, una volta raggiunto il limite dello heap, viene
invocato di continuo.
Spero di esserti stato d'aiuto, cmq se alleghi la parte di codice  che
gestisce l'inserimento nel Vector ed il suo scarico ci si può ragionare.
Ciao,
    Alessio


non mi hai fatto risolvere il problema, ma ho sicuramente imparato qualcosa!
:)
Ciao


Allora il problema può essere dovuto ad un uso eccessivo della
concatenazione di stringhe o alla creazione di oggetti durante la
conversione di dati numerici in stringa per la visualizzazione: in rete puoi
trovare vari articoli su questo tipo di ottimizzazioni (prova nella sezione
tips di 
javaworld.com
).

 tips di 
javaworld.com
).
ho effettuato numerose prove e mi sono accorto che il grosso dell'aumento di
occupazione di ram č dovuto alla sola parte di visualizzazione grafica (l'ho
provato mettendo setVisible(false) ai Frame che contenevano le varie labels
e strumenti che vengono aggiornati). In piů l'occupazione cresce anche
semplicemente clickando in giro o aprendo menu!!
Com'č possibile???
Ciao
Sebi

Che runtime usi?


la 1.3.
ho notato che lo stesso comportamento lo ha anche il java.exe che fa
funzionare JBuilder (la 6): l'uso di memoria cresce aprendo menu e clickando
in giro!!
giuro che JBuilder non l'ho scritto io quindi possibile che sia io che la
Borland faccia gli stessi errori?!?!?! :)
Ciao