创建名为“ {java}”的线程(即轻量级进程)是为了什么?

时间:2019-04-13 14:58:44

标签: java linux jvm

我写了一个Java程序,它会休眠一段时间:

package com.mycompany.app;

import java.lang.System;
import java.util.concurrent.TimeUnit;

public class Main {
    public static void main(String[] args) {
    System.out.println("the current process's pid is " + ProcessHandle.current().pid());
    try {
        TimeUnit.SECONDS.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Hello World!"); // Prints the string to the console.

    }
}

我运行以下程序:

$ java -cp target com.mycompany.app.Main 
the current process's pid is 10172

我检查了Ubuntu创建的运行它的过程:

$ pstree -pau -l -G -s 10172
systemd,1 splash
  └─lxterminal,3194,t
      └─bash,12150
          └─java,10172 -cp target com.mycompany.app.Main
              ├─{java},10173
              ├─{java},10174
              ├─{java},10175
              ├─{java},10176
              ├─{java},10177
              ├─{java},10178
              ├─{java},10179
              ├─{java},10180
              ├─{java},10181
              ├─{java},10182
              ├─{java},10183
              ├─{java},10184
              ├─{java},10185
              ├─{java},10186
              ├─{java},10187
              ├─{java},10188
              ├─{java},10189
              └─{java},10190
  • {java}创建的那些线程(即轻量级进程)是做什么用的?
  • 是否可以使用一些命令从shell中运行哪些程序?
  • 哪些进程(和LWP)正在运行JVM?
  • 哪个进程(和LWP)正在运行我的Java程序?

2 个答案:

答案 0 :(得分:5)

所有这些线程都属于JVM。
运行jstack <pid>以获取线程列表。

"main" #1 prio=5 os_prio=0 cpu=150.00ms elapsed=8.04s tid=0x00007f9f90011000 nid=0x107 waiting on condition  [0x00007f9f99f9f000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(java.base@11.0.1/Native Method)
        at java.lang.Thread.sleep(java.base@11.0.1/Thread.java:339)
        at java.util.concurrent.TimeUnit.sleep(java.base@11.0.1/TimeUnit.java:446)
        at com.mycompany.app.Main.main(Main.java:10)

"Reference Handler" #2 daemon prio=10 os_prio=0 cpu=0.00ms elapsed=7.95s tid=0x00007f9f901f9000 nid=0x10e waiting on condition  [0x00007f9f6c10f000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.ref.Reference.waitForReferencePendingList(java.base@11.0.1/Native Method)
        at java.lang.ref.Reference.processPendingReferences(java.base@11.0.1/Reference.java:241)
        at java.lang.ref.Reference$ReferenceHandler.run(java.base@11.0.1/Reference.java:213)

"Finalizer" #3 daemon prio=8 os_prio=0 cpu=0.00ms elapsed=7.95s tid=0x00007f9f901fd800 nid=0x10f in Object.wait()  [0x00007f9f65fef000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.1/Native Method)
        - waiting on <0x0000000712108f80> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@11.0.1/ReferenceQueue.java:155)
        - waiting to re-lock in wait() <0x0000000712108f80> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@11.0.1/ReferenceQueue.java:176)
        at java.lang.ref.Finalizer$FinalizerThread.run(java.base@11.0.1/Finalizer.java:170)

"Signal Dispatcher" #4 daemon prio=9 os_prio=0 cpu=0.00ms elapsed=7.93s tid=0x00007f9f90210000 nid=0x110 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 cpu=40.00ms elapsed=7.93s tid=0x00007f9f90212000 nid=0x111 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"C1 CompilerThread0" #7 daemon prio=9 os_prio=0 cpu=40.00ms elapsed=7.93s tid=0x00007f9f90214000 nid=0x112 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"Sweeper thread" #8 daemon prio=9 os_prio=0 cpu=10.00ms elapsed=7.93s tid=0x00007f9f90216000 nid=0x113 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Service Thread" #9 daemon prio=9 os_prio=0 cpu=0.00ms elapsed=7.90s tid=0x00007f9f902d3800 nid=0x114 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Common-Cleaner" #10 daemon prio=8 os_prio=0 cpu=0.00ms elapsed=7.89s tid=0x00007f9f902df800 nid=0x116 in Object.wait()  [0x00007f9f656ef000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.1/Native Method)
        - waiting on <0x0000000712002df0> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@11.0.1/ReferenceQueue.java:155)
        - waiting to re-lock in wait() <0x0000000712002df0> (a java.lang.ref.ReferenceQueue$Lock)
        at jdk.internal.ref.CleanerImpl.run(java.base@11.0.1/CleanerImpl.java:148)
        at java.lang.Thread.run(java.base@11.0.1/Thread.java:834)
        at jdk.internal.misc.InnocuousThread.run(java.base@11.0.1/InnocuousThread.java:134)

"Attach Listener" #11 daemon prio=9 os_prio=0 cpu=0.00ms elapsed=0.21s tid=0x00007f9f44001000 nid=0x126 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"VM Thread" os_prio=0 cpu=0.00ms elapsed=7.95s tid=0x00007f9f901f1000 nid=0x10d runnable

"GC Thread#0" os_prio=0 cpu=0.00ms elapsed=8.01s tid=0x00007f9f90038800 nid=0x108 runnable

"G1 Main Marker" os_prio=0 cpu=0.00ms elapsed=8.00s tid=0x00007f9f90097800 nid=0x109 runnable

"G1 Conc#0" os_prio=0 cpu=0.00ms elapsed=8.00s tid=0x00007f9f90099800 nid=0x10a runnable

"G1 Refine#0" os_prio=0 cpu=0.00ms elapsed=8.00s tid=0x00007f9f9018d000 nid=0x10b runnable

"G1 Young RemSet Sampling" os_prio=0 cpu=0.00ms elapsed=8.00s tid=0x00007f9f9018f000 nid=0x10c runnable
"VM Periodic Task Thread" os_prio=0 cpu=0.00ms elapsed=7.90s tid=0x00007f9f902d6000 nid=0x115 waiting on condition

这里nid是操作系统中线程的十六进制ID-您可以将其与pstree的输出相匹配。

  • 第一个名为main的线程是执行代码的线程。

  • Reference Handler线程负责将垃圾收集器发现的弱引用,软引用和幻像引用添加到已注册的ReferenceQueues中。

  • Finalizer线程对准备完成的对象运行finalize方法。

  • Signal Dispatcher等待特定的OS信号并处理它们。特别是,它在SIGQUIT上进行线程转储,并在SIGTERMSIGINTSIGHUP上启动VM关闭过程。

  • CompilerThreads对字节码执行JIT编译。

  • Sweeper thread清除过时的编译方法。

  • Service Thread运行一些后台JVM任务:检测内存不足情况,清理StringTable和SymbolTable,发送延迟的JVMTI事件和GC通知等。

  • Common-Cleaner运行java.lang.ref.Cleaner实例的清理操作。

  • Attach Listener线程支持动态附加机制。它侦听传入的动态附加连接并执行VM命令。例如,jstackjmapjcmd实用程序使用它。

  • VM Thread运行需要safepoint的内部VM操作。此类操作的示例包括反优化,类重新定义,有偏的锁吊销,线程转储,堆检查等。

  • G1线程与垃圾回收有关。

  • VM Periodic Task Thread用于模拟计时器中断。

答案 1 :(得分:-1)

这是我能找到的最好的,但我不确定CMD下列出的命令是什么意思

$ ps -eL -q 10172
  PID   LWP TTY          TIME CMD
10172 10172 pts/8    00:00:00 java
10172 10173 pts/8    00:00:00 java
10172 10174 pts/8    00:00:00 GC Thread#0
10172 10175 pts/8    00:00:00 GC Thread#1
10172 10176 pts/8    00:00:00 G1 Main Marker
10172 10177 pts/8    00:00:00 G1 Conc#0
10172 10178 pts/8    00:00:00 G1 Refine#0
10172 10179 pts/8    00:00:00 G1 Refine#1
10172 10180 pts/8    00:00:00 G1 Young RemSet
10172 10181 pts/8    00:00:00 VM Thread
10172 10182 pts/8    00:00:00 Reference Handl
10172 10183 pts/8    00:00:00 Finalizer
10172 10184 pts/8    00:00:00 Signal Dispatch
10172 10185 pts/8    00:00:00 C2 CompilerThre
10172 10186 pts/8    00:00:00 C1 CompilerThre
10172 10187 pts/8    00:00:00 Sweeper thread
10172 10188 pts/8    00:00:00 Service Thread
10172 10189 pts/8    00:00:00 VM Periodic Tas
10172 10190 pts/8    00:00:00 Common-Cleaner