Java Thread是否有自己的进程ID?

Phi*_*ess 6 java multithreading process

我想获取一个Thread的进程ID,看看它需要多少内存.

Joa*_*uer 11

它在很大程度上取决于操作系统以及它如何管理线程.从理论上讲,它还取决于JVM如何实现线程,但所有现代JVM都将它们实现为本机线程.

在Linux上,每个线程用于获取自己的进程ID,但是大多数工具都隐藏了每个进程除了一个线程之外的所有进程(即除非您明确要求它们,否则通常不会看到它们,例如ps使用-m标志).这是因为Linux内核在线程和任务之间并没有太大区别.

编辑:正如我刚刚了解到的那样不再这种情况:您可以使用与父级完全相同的PID创建一个线程,在这种情况下,线程将通过不同的线程ID进行区分.

但是,由于线程与同一进程中的所有其他线程共享其内存,因此无法帮助您找出"线程需要多少内存",因为进程中的所有线程将使用完全相同的数量(并且它们都使用同样的,所以实际使用的内存是shown_memory_use和不是shown_memory_user * number_of_threads).

  • 这就是Linux的工作方式.单独的进程ID并不意味着内存是分开的,即使常规进程在分支之后也直接与父进程共享内存(尽管写时复制).您可以创建共享相同PID的线程(使用CLONE_THREAD克隆(2)),但较旧的方法是为每个线程提供自己的PID.不知道今天的JVM使用什么样的克隆. (3认同)