Для чего создаются потоки (то есть облегченные процессы) с именем `{java}`? - PullRequest
6 голосов
/ 13 апреля 2019

Я написал программу на 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}?
  • Можно ли узнать, какие программы они запускают из оболочки, используя некоторые команды?
  • Какие процессы (и LWP) выполняют JVM?
  • Какие процессы (и LWP) выполняют мою Java-программу?

1 Ответ

5 голосов
/ 14 апреля 2019

Все эти темы принадлежат 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 - шестнадцатеричный идентификатор потока в ОС - вы можете сопоставить его с выводом pstree.

  • Первый поток с именем main - это поток, выполняющий ваш код.

  • Reference Handler поток отвечает за добавление слабых, мягких и фантомных ссылок, обнаруженных сборщиком мусора, в их зарегистрированные ReferenceQueues .

  • Finalizer выполняется поток finalize метод объектов, готовых к финализации.

  • Signal Dispatcher ожидает определенных сигналов ОС и обрабатывает их. В частности, он создает дамп потока на SIGQUIT, а также инициирует процесс выключения виртуальной машины на SIGTERM, SIGINT и SIGHUP.

  • CompilerThreads выполнить JIT-компиляцию байт-кода.

  • Sweeper thread убирает устаревшие скомпилированные методы.

  • Service Thread запускает несколько фоновых задач JVM: обнаруживает состояние нехватки памяти, очищает StringTable и SymbolTable, отправляет отложенные события JVMTI и уведомления GC и т. Д.

  • Common-Cleaner запускает действия по очистке java.lang.ref.Cleaner экземпляров.

  • Attach Listener поток поддерживает механизм динамического присоединения. Он прослушивает входящие соединения Dynamic Attach и выполняет команды VM. Например, он используется утилитами jstack, jmap и jcmd.

  • VM Thread выполняет внутренние операции виртуальной машины, для которых требуется safepoint . Примерами таких операций являются деоптимизация, переопределение классов, отзыв смещенной блокировки, дамп потока, проверка кучи и т. Д.

  • G1 темы участвуют в сборке мусора.

  • VM Periodic Task Thread используется для имитации прерываний по таймеру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...