Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [Strano ma Java] Uno spazzino troppo solerte?

    Riepilogando: ho la mia applicazione che esegue un compito estremamente gravoso per la CPU.
    Dopo averla inglobata in un thread sicuro (usando SwingWorker come da tutorial del sito SUN) ho risolto il problema per il quale l'intera finestra non rispondeva piu' agli eventi durante il task.
    Pero', attivando la Progress Bar, mi sono accorto che la finestra rimane comunque IDLE per parecchi secondi, e piu' volte durante il task: la barra resta ferma per tre-quattro secondi, scatta a recuperare il tempo perduto, avanza fluidamente per due-tre secondi, si riblocca...

    Ho pensato che il problema poteva essere il garbage collector chiamato troppo frequentemente. Cosi' ho usato l'opzione di debug "-verbose:gc" della JVM e... magia delle magie... la finestra non si blocca piu'. In compenso, il task e' piu' lento (di circa il 10%)
    In effetti il GC viene richiamato almeno venti volte al secondo, il che non e' normale...

    Qualche idea su cosa succeda nei meandri della JVM?
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  2. #2
    com'è l'utilizzo della memoria?
    Se provi a darne un po' di più all'applicazione che succede?

  3. #3
    Posto un po' di dettagli:

    ------------------

    Caso 1: <nessun parametro>

    Tempo di esecuzione: 18 secondi
    (La Progress Bar e' ferma per lunghi periodi)

    -------------------

    Caso 1bis: -XX:+PrintGCDetails

    Tempo di esecuzione: 19.4 secondi
    (La Progress Bar non e' mai ferma)

    Output del GC:

    [GC [DefNew: 575K->34K(576K), 0.0019692 secs] 1211K->725K(1984K), 0.0020237 secs]
    [GC [DefNew: 545K->0K(576K), 0.0006174 secs] 1237K->725K(1984K), 0.0006585 secs]
    [GC [DefNew: 512K->0K(576K), 0.0002922 secs] 1237K->725K(1984K), 0.0003375 secs]
    [GC [DefNew: 512K->0K(576K), 0.0004411 secs] 1237K->725K(1984K), 0.0004861 secs]
    [GC [DefNew: 512K->0K(576K), 0.0002713 secs] 1237K->725K(1984K), 0.0003112 secs]
    [GC [DefNew: 512K->0K(576K), 0.0002327 secs] 1237K->725K(1984K), 0.0002718 secs]
    [GC [DefNew: 512K->0K(576K), 0.0002305 secs] 1237K->725K(1984K), 0.0002699 secs]
    [GC [DefNew: 512K->0K(576K), 0.0002308 secs] 1237K->725K(1984K), 0.0002699 secs]
    [GC [DefNew: 512K->0K(576K), 0.0002495 secs] 1237K->725K(1984K), 0.0002889 secs]
    [GC [DefNew: 512K->0K(576K), 0.0002271 secs] 1237K->725K(1984K), 0.0011599 secs]
    [GC [DefNew: 512K->0K(576K), 0.0002629 secs] 1237K->725K(1984K), 0.0003067 secs]

    (e cosi' via ad libitum...)

    ------------------

    Caso 2: -Xms32m -Xmx128m

    Tempo di esecuzione: 15.7 secondi
    (La Progress Bar si blocca a sprazzi)

    ------------------

    Caso 2bis: -Xms32m -Xmx128m -XX:+PrintGCDetails

    Tempo di esecuzione: 16.2 secondi
    (La Progress Bar si blocca raramente o mai)

    Output del GC:

    [GC [DefNew: 2112K->192K(2304K), 0.0136034 secs] 2112K->666K(32576K), 0.0137090 secs]
    [GC [DefNew: 2304K->33K(2304K), 0.0042614 secs] 2778K->698K(32576K), 0.0043201 secs]
    [GC [DefNew: 2145K->32K(2304K), 0.0018469 secs] 2810K->698K(32576K), 0.0018977 secs]
    [GC [DefNew: 2144K->32K(2304K), 0.0003830 secs] 2810K->698K(32576K), 0.0004255 secs]
    [GC [DefNew: 2144K->32K(2304K), 0.0004048 secs] 2810K->698K(32576K), 0.0004582 secs]
    [GC [DefNew: 2144K->32K(2304K), 0.0004151 secs] 2810K->698K(32576K), 0.0004612 secs]
    [GC [DefNew: 2144K->32K(2304K), 0.0004042 secs] 2810K->698K(32576K), 0.0004492 secs]
    [GC [DefNew: 2144K->32K(2304K), 0.0003961 secs] 2810K->698K(32576K), 0.0007610 secs]
    [GC [DefNew: 2144K->32K(2304K), 0.0004098 secs] 2810K->698K(32576K), 0.0004551 secs]

    (e cosi' via ad libitum...)

    --

    Con 64 mega non cambia niente...

    Non vorrei aver implementato male la PB... Il fatto e' che pero', con le opzioni di debug, riprende a funzionare, e non riesco a spiegarmelo...

    Mah...
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  4. #4
    scusa il ritardo, ma ho letto solo ora la tua risposta.

    Il problema sembrerebbe essere l'utilizzo della memoria, che comporta un frequente utilizzo di gc, che è dispendioso per la VM.

    Potresti valutare la cosa con -verbose:gc + stampa thread che utilizzano la memoria, aumentando la memoria minima disponobile per l'applicazione.

  5. #5
    Ah, ho risolto il problema, era una "ottimizzazione" che avevo fatto... ^___^ In pratica creavo un nuovo array ad ogni iterazione.
    Ora l'ho reso membro della classe e mi limito a riempirlo.
    La velocita' di esecuzione e' parecchio aumentata e il GC viene chiamato una/due volte al minuto, quando va male!
    Grazie per la risposta, cmq...

    Pero' a quanto pare non era quello il problema della Progress Bar, che continua ad andare a scatti. Oggi faccio qualche altra prova...
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.