2013-05-03 11 views

risposta

5

Quando i metodi run finiture, sia esso normalmente o a causa di un'eccezione, tutti gli oggetti che crea sono liberi di essere garbaged, senza bisogno di una pulizia specifica.

È necessaria solo una pulizia delle risorse che devono essere chiuse (connessioni DB, flussi di file e così via). Questa pulizia viene normalmente eseguita in una clausola finally dopo il catch.

public void run(){ 
    Statement statement; 
    try{ 
     MyDAO dao = new MyDAO(); // doesn't need closing 
     List<Results> res = dao.findResults(...); 
     statement = getStatement(); // must be closed 
     .... 
    } catch (Exception e){ 
     // handle the error 
    } finally { 
     if (statement!=null) statement.close(); 
    } 
} 
+0

Grazie per la risposta pulita :) – sura2k

2

Gli oggetti sono automaticamente garbage ammissibili raccolti quando non hanno più riferimenti, così finché nulla dalle vostre discussioni viene fatto riferimento da altri oggetti, allora si dovrebbe essere a posto.

È importante notare che la garbage collection di Java (utilizzando System.gc()) non garantisce la raccolta dei dati inutili.

4

Si non è necessario effettuare una pulizia particolare, a meno che non si disponga di risorse di sistema aperte come i file. Non appena terminano i thread, indipendentemente dal fatto che siano normali o eccezionali, vengono puliti dal sistema operativo o dalla macchina virtuale (stack di thread, ...).

Gli oggetti Thread vengono recuperati dal semplice GC Java. Generalmente GC eseguirà una raccolta quando stai esaurendo la memoria. Tuttavia, non è deterministico.

Per migliorare l'efficienza della memoria in generale, si potrebbe considerare il refactoring le discussioni che in compiti e un pool di thread, che rade circa un megabyte (cifra approssimativa!) Per thread:

  • Un'implementazione di ExecutorService esegue attività sui thread. Se si esegue principalmente il lavoro con la CPU piuttosto che l'I/O, è generalmente necessario avere tanti thread quanti sono i core piuttosto che centinaia di thread. Esistono implementazioni esistenti, ma è anche possibile implementare il proprio servizio executor.
  • A Callable<T> è un'implementazione di attività. Forse molto simile a quello che potresti fare non con gli oggetti Runnable.
  • A Future<T> contiene una promessa per un risultato dell'attività.
Problemi correlati