【问题标题】:Does a Java Thread have its own process ID?Java 线程是否有自己的进程 ID?
【发布时间】:2011-08-17 09:20:08
【问题描述】:

我想获取一个线程的进程ID,看看它占用了多少内存。

【问题讨论】:

  • 好的,谢谢(:您可能想将此作为答案发布,以便我接受;)
  • 我确定,是的。 (; 我的想法是通过进程 ID 检查单个线程的 RAM 使用情况。
  • 在这种情况下,您需要在单独的进程中运行线程所做的事情。通常,这比它的价值更麻烦。相反,使用分析器运行应用程序并根据您的判断将最大的结构与线程关联起来会更容易。
  • 为什么不使用进程而不是线程?
  • 线程 ID 不会让您了解特定线程使用了多少内存。考虑到对象可以有来自多个线程的多个引用,这个问题实际上毫无意义。投票结束。

标签: java multithreading process


【解决方案1】:

这在很大程度上取决于操作系统及其管理线程的方式。理论上它也取决于JVM如何实现线程,但所有现代JVM都将它们实现为原生线程。

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

编辑: 正如我刚刚了解到的,这不再是必要的情况:您可以创建一个具有完全相同 PID 的线程parent,在这种情况下,线程将通过不同的线程 ID 进行区分。

但是由于一个线程与同一进程中的所有其他线程共享其内存,这帮助您找出“线程占用多少内存”,因为一个进程中的所有线程都将使用完全相同的数量(而且它们都使用相同的内存,所以实际使用的内存是shown_memory_use 而不是shown_memory_user * number_of_threads)。

【讨论】:

  • 如果'一个线程与同一进程中的所有其他线程共享它的内存'它怎么会有一个不同的进程ID?线程 ID,是的。
  • 这就是 Linux 的工作方式。单独的进程 ID 并不意味着内存是分离的,即使是常规进程在分叉后直接与父进程共享内存(尽管写时复制)。您可以创建共享相同 PID 的线程(clone(2) 与 CLONE_THREAD),但较旧的方法是为每个线程提供自己的 PID。但不确定今天的 JVM 使用哪种克隆。
  • 感谢您的回答!这正是我的意思:)
  • @Tim Jansen 因此,Linux 进程 ID 实际上是线程 ID。这并不能回答问题。
  • @EJP:有点像:从线程获取(进程|线程)ID 高度依赖于操作系统获取“每个线程使用的内存”不是一个有用的指标,因为它包括了进程占用的所有内存。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    顾名思义,PID 表示进程 ID。每个进程可以产生多个线程,它们都共享相同的 PID。你确定你说的不是线程 ID?

    【讨论】:

      【解决方案4】:

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

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

      值得注意的是,主存相对便宜。您的情况可能有所不同,但一个典型的 24 GB 新服务器的成本可能低至 1000 英镑。您可以花 2000 英镑左右购买一台 96 GB 的 PC。有时,在您知道这是个问题之前,不必担心您使用了多少内存。

      【讨论】:

        猜你喜欢
        • 2012-04-18
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多