2011-08-17 15 views
5

Quiero obtener la ID de proceso de un subproceso para ver la cantidad de memoria que se necesita.¿Tiene un subproceso de Java su propia identificación de proceso?

+0

Bien, gracias (: Es posible que desee publicar esto como respuesta para que pueda aceptarlo;) –

+0

Estoy seguro, sí. (; Mi idea era comprobar el uso de RAM de un solo hilo a través del ID del proceso. –

+1

En ese caso, debe ejecutar lo que el hilo hace en un proceso separado. En general, esto es más problemas de lo que vale. En su lugar, puede ser más fácil ejecutar su aplicación con un generador de perfiles y asociar las estructuras más grandes con un hilo usando su juicio. –

Respuesta

10

Depende mucho del SO y de cómo gestiona los hilos. En teoría, también depende de cómo la JVM implementa los hilos, pero todas las JVM modernas los implementan como hilos nativos.

En Linux cada hilo se utilizado para obtener su propio identificador de proceso, pero la mayoría de las herramientas de ocultar todos menos un hilo por proceso (es decir, que no suelen verlos a menos que pedir expresamente para ellos, ps utiliza la bandera -m por ejemplo). Esto es causado por el hecho de que el kernel de Linux realmente no hace mucha diferencia entre los hilos y las tareas.

Editar: como acabo de aprender esto ya no es necesariamente el caso: que puede crear un hilo con exactamente el mismo PID como el padre, en cuyo caso los hilos se distinguen por diferentes ID de hilo .

Sin embargo desde un hilo comparte su memoria con todos los otros hilos en el mismo proceso, esta no ayuda a averiguar "la cantidad de memoria un hilo de toma", ya que todos los hilos en un proceso utilizarán el exactamente la misma cantidad (y todos usan lo mismo, por lo que la memoria real utilizada es shown_memory_use y no shown_memory_user * number_of_threads).

+0

Si 'un hilo comparte su memoria con todos los otros hilos en el mismo proceso' ¿cómo puede tener un ID de proceso distinto? sí. – EJP

+2

Así es como funciona Linux. Una ID de proceso separada no implica que la memoria esté separada, incluso un proceso común comparte memoria con el padre directamente después de bifurcarlo (sin embargo, copy-on-write). Puede crear hilos que comparten el mismo PID (clonar (2) con CLONE_THREAD), pero la forma más antigua de hacerlo era dar a cada hilo un PID propio. Sin embargo, no estoy seguro de qué tipo de clon utilizan las JVM de hoy. –

+0

¡Gracias por tu respuesta! Esto es exactamente lo que quise decir :) –

3

Como su nombre lo indica, PID significa ID del proceso. Cada proceso puede engendrar múltiples hilos, que comparten el mismo PID. ¿Estás seguro de que no te refieres a Thread ID?

4

Los hilos no tienen PID, los procesos sí. Como tal, lo que estás preguntando no es posible. Tampoco hay una manera confiable de recuperar su PID desde un proceso Java (aunque la primera parte del valor devuelto por ManagementFactory.getRuntimeMXBean().getName() suele ser el PID).

1

Una característica del hilo es que comparte el montón con todos los demás hilos. Esto significa que cualquier hilo puede usar casi toda la memoria del proceso. Lo único a lo que un hilo no tiene acceso es la pila o las variables locales de otro hilo.

Como tal, no es útil tratar de determinar cuánta memoria utiliza una hebra individual. En su lugar, puede ser útil determinar cuánta memoria utiliza una estructura de datos. (Aunque esto puede tener dificultades similares)

Vale la pena señalar que la memoria principal es relativamente barata. Su situación puede ser diferente, pero un nuevo servidor típico con 24 GB puede costar tan poco como £ 1K. Puede comprar una PC de 96 GB por alrededor de £ 2K. A veces no vale la pena preocuparse por la cantidad de memoria que está utilizando hasta que sepa que es un problema.

Cuestiones relacionadas