2011-08-17 30 views
5

Voglio ottenere l'ID di processo di una discussione per vedere quanta memoria ci vuole.Un thread Java ha il proprio ID di processo?

+0

Ok, grazie (: puoi postare questo come risposta in modo che io possa accettarlo;) –

+0

Sono sicuro, sì. (; La mia idea era di verificare l'utilizzo della RAM di un singolo thread tramite l'ID del processo. –

+1

In tal caso, è necessario eseguire ciò che il thread fa in un processo separato.In genere, questo è più un problema che un valore. può essere più semplice eseguire la tua applicazione con un profiler e associare le strutture più grandi a una discussione usando il tuo giudizio –

risposta

10

Dipende molto dal sistema operativo e da come gestisce i thread. In teoria, dipende anche da come JVM implementa i thread, ma tutti i JVM moderni li implementano come thread nativi.

Su Linux ogni thread sarà utilizzato per ottenere il proprio ID di processo, ma la maggior parte strumenti di nascondere tutto, ma un thread per ogni processo (cioè di solito non li vedi a meno che non esplicitamente chiedere loro, ps usa la bandiera -m per esempio). Questo è causato dal fatto che il kernel di Linux non fa davvero molta differenza tra thread e attività.

Edit: come ho appena imparato questo non è più necessariamente il caso: si possibile creare un thread con lo stesso identico PID come il genitore, nel qual caso i fili saranno contraddistinti da diversi ID di filo .

Tuttavia dal momento che un filo condivide la sua memoria con tutti gli altri thread nello stesso processo, questa non aiutare a scoprire "la quantità di memoria un filo prende", dal momento che tutte le discussioni in un processo utilizzeranno la la stessa quantità esatta (e tutti usano lo stesso, quindi la memoria reale utilizzata è shown_memory_use e non shown_memory_user * number_of_threads).

+0

Se "un thread condivide la sua memoria con tutti gli altri thread nello stesso processo" come può avere un ID di processo distinto? sì. – EJP

+2

Questo è solo il modo in cui Linux funziona. Un ID di processo separato non implica che la memoria sia separata, anche se un normale processo condivide la memoria con il genitore direttamente dopo averlo forato (copia-su-scrittura però). È possibile creare thread che condividono lo stesso PID (clone (2) con CLONE_THREAD), ma il modo più vecchio di farlo era di assegnare a ciascun thread un PID a sé stante. Non sono sicuro del tipo di clone che le JVM di oggi usano però. –

+0

Grazie per la risposta! Questo è esattamente ciò che intendevo :) –

3

Come indica il nome, PID indica ID processo. Ogni processo può generare più thread, che condividono tutti lo stesso PID. Sei sicuro di non voler dire ID filo?

4

I thread non hanno PID, i processi lo fanno. In quanto tale, ciò che stai chiedendo non è possibile. Non esiste anche un modo affidabile per recuperare il PID da un processo Java (sebbene la prima parte del valore restituito da ManagementFactory.getRuntimeMXBean().getName() di solito sia il PID).

1

Una funzionalità di thread è che condivide l'heap con tutti gli altri thread. Ciò significa che qualsiasi thread può potenzialmente utilizzare quasi tutta la memoria del processo. L'unica cosa a cui un thread non ha accesso è lo stack o le variabili locali di un altro thread.

Come tale non è utile provare a determinare la quantità di memoria utilizzata da un singolo thread. Invece può essere utile determinare la quantità di memoria utilizzata da una struttura di dati. (Anche se questo può avere difficoltà simili)

Vale la pena notare che la memoria principale è relativamente economica. La tua situazione potrebbe essere diversa, ma un tipico nuovo server con 24 GB può costare solo £ 1K. È possibile acquistare un PC da 96 GB per circa £ 2K. A volte non vale la pena preoccuparsi di quanta memoria si sta usando fino a quando non si sa che è un problema.

Problemi correlati