JVM進程啓動會啓動哪些線程?

首先要明白一點:JVM自己是一個多線程的程序,和咱們編寫的java應用程序同樣,當JVM啓動執行時就是在操做系統中啓動了一個JVM進程。咱們編寫的java單線程或多線程應用進程都是在JVM這個程序中做爲一個或多個線程運行。java

每當使用java命令執行一個帶main方法的類時,就會啓動JVM(應用程序),實際上就是在操做系統中啓動一個JVM進程,JVM啓動時,必然會建立如下5個線程:多線程

1-main                                   主線程,執行咱們指定的啓動類的main方法jvm

2-Reference Handler             處理引用的線程 spa

3-Finalizer                              調用對象的finalize方法的線程,就是垃圾回收的線程 操作系統

4-Signal Dispatcher               分發處理髮送給JVM信號的線程  線程

5-Attach Listener                   負責接收外部的命令的線程對象

Attach Listener :該線程是負責接收到外部的命令,執行該命令,而且把結果返回給發送者。一般咱們會用一些命令去要求jvm給咱們一些反饋信息,如:java -version、jmap、                                     jstack等等。若是該線程在jvm啓動的時候沒有初始化,那麼,則會在用戶第一次執行jvm命令時,獲得啓動。進程

signal dispather: 前面咱們提到第一個Attach Listener線程的職責是接收外部jvm命令,當命令接收成功後,會交給signal dispather線程去進行分發到各個不一樣的模塊處理命令,並                                  且返回處理結果。signal dispather線程也是在第一次接收外部jvm命令時,進行初始化工做。get

Finalizer:  JVM在垃圾收集時會將失去引用的對象包裝成Finalizer對象(Reference的實現),並放入ReferenceQueue,由Finalizer線程來處理;最後將該Finalizer對象的引用置爲null,由垃圾收集器來回收。io

Reference Handler :它主要用於處理引用對象自己(軟引用、弱引用、虛引用)的垃圾回收問題。

main:主線程,用於執行咱們編寫的java程序的main方法。

 

可編寫java應用程序查看JVM啓動時建立的全部線程,代碼以下:

package com.jvmTest;

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;

public class JVMTest {
  public static void main(String[] args) throws Exception {
    ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
    ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
    for(ThreadInfo threadInfo : threadInfos) {
      System.out.println(threadInfo.getThreadId() + "-" + threadInfo.getThreadName());
    }
  }
}

----------------------------------------------

輸出以下:

5-Attach Listener4-Signal Dispatcher3-Finalizer2-Reference Handler1-main

相關文章
相關標籤/搜索