2009-09-29 12 views
12

Qual è il "costo" approssimativo dell'utilizzo di thread in java? Ci sono regole empiriche o valori empirici, quanta memoria costa la creazione di un thread? C'è una stima approssimativa di quanti cicli di CPU costa creare un thread?Qual è il "costo" approssimativo di una discussione nei cicli e nella memoria della CPU?

Contesto: in un servlet di un'applicazione Web, desidero parallelizzare la creazione del contenuto in quanto parti del contenuto sono basate su file, basate su database e basate su servizi web. Ma questo significherebbe che per ogni "http-request-thread" (del mio contenitore di serlvet) avrò da due a quattro thread aggiuntivi. Nota che userò lo ExecutorService in Java 6.

Cosa devo aspettarmi quando uso centinaia o migliaia di thread Java su un server web?

risposta

13

Ogni thread ha il proprio stack, e di conseguenza c'è un effetto memoria immediata. La dimensione predefinita dello stack di thread è, IIRC, per Java 6, 512k (diverse JVM/versioni possono avere valori predefiniti diversi). Questa cifra è regolabile usando l'opzione -Xss. Di conseguenza l'utilizzo di centinaia di thread avrà un impatto sulla memoria che la macchina virtuale consuma (molto probabilmente prima di qualsiasi impatto della CPU, a meno che quei thread non siano in esecuzione).

clienti che ho visto correre in problemi legati alla fili/la memoria, dato che non è un legame evidente. È banale creare 100.000 thread (utilizzando executor/pool ecc.) E problemi di memoria non sembrano essere immediatamente attribuibili a questo.

Se si stanno assistendo molti client, si consiglia di dare un'occhiata all'API Java NIO e in particolare a multiplexing, che consente la programmazione di rete asincrona. Ciò ti consentirà di gestire molti client con un solo thread e di conseguenza ridurrà il tuo fabbisogno per un numero enorme di thread.

1

Beh dipende: Dipende dal sistema operativo, la versione Java, e la CPU. L'unico modo per capirlo è provarlo e misurare i risultati.

Dal momento che sarete utilizzando il ExecutorService, sarà semplice per controllare il numero di thread. Non usare troppo poche o le richieste si impilano. Se ne usi troppi, ti imbatterai in problemi di prestazioni con il tuo file system e con il DB molto prima che Java esaurisca i thread.

Problemi correlati