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

时间:2011-08-17 09:20:09

标签: java multithreading process

我想获取一个Thread的进程ID以查看它需要多少内存。

4 个答案:

答案 0 :(得分:11)

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

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

编辑:因为我刚刚了解到这不再是必然的情况:你可以创建一个与PID完全相同的线程parent,在这种情况下,线程将通过不同的线程ID进行区分。

但是,因为一个线程与同一进程中的所有其他线程共享其内存,这个不会帮助你找出“一个线程需要多少内存”,因为进程中的所有线程都将使用完全相同的数量(并且它们都使用相同的数据,因此实际使用的内存为-m而不是shown_memory_use)。

答案 1 :(得分:4)

线程没有PID,进程有。因此,你所要求的是不可能的。还没有可靠的方法从Java进程中检索PID(尽管ManagementFactory.getRuntimeMXBean().getName()返回的值的第一部分通常是PID)。

答案 2 :(得分:3)

顾名思义,PID表示进程ID。每个进程都可以生成多个线程,这些线程共享相同的PID。你确定你不是指线程ID吗?

答案 3 :(得分:1)

线程的一个特性是与所有其他线程共享堆。这意味着任何一个线程都可能使用该进程的几乎所有内存。线程无法访问的唯一内容是另一个线程的堆栈或局部变量。

因此,尝试确定单个线程使用的内存量是没有用的。相反,确定数据结构使用多少内存可能很有用。 (虽然这可能有类似的困难)

值得注意的是,主内存相对便宜。您的情况可能会有所不同,但典型的24 GB新服务器的成本仅为1K英镑。您可以以约2K英镑的价格购买96 GB的PC。有时候,在你知道这是一个问题之前,不值得担心你使用了多少内存。