zoukankan      html  css  js  c++  java
  • JVM进程启动会启动哪些线程?

    首先要明白一点:JVM本身是一个多线程的程序,和我们编写的java应用程序一样,当JVM启动执行时就是在操作系统中启动了一个JVM进程。我们编写的java单线程或多线程应用进程都是在JVM这个程序中作为一个或多个线程运行。

    每当使用java命令执行一个带main方法的类时,就会启动JVM(应用程序),实际上就是在操作系统中启动一个JVM进程,JVM启动时,必然会创建以下5个线程:

    1-main                                   主线程,执行我们指定的启动类的main方法

    2-Reference Handler             处理引用的线程 

    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命令时,进行初始化工作。

    Finalizer:  JVM在垃圾收集时会将失去引用的对象包装成Finalizer对象(Reference的实现),并放入ReferenceQueue,由Finalizer线程来处理;最后将该Finalizer对象的引用置为null,由垃圾收集器来回收。

    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 Listener
    4-Signal Dispatcher
    3-Finalizer
    2-Reference Handler
    1-main

  • 相关阅读:
    MySql 数据类型
    MySql 数据库的增删改
    MySql 联合查询
    Mysql 库的管理 --->>>>DDL
    MySql 子查询
    MySql 分页查询
    sql99语法的连接查询
    MySql 连接查询
    MySql 分组函数
    jQ处理页面中尺寸过大的图片
  • 原文地址:https://www.cnblogs.com/jiangwangxiang/p/9094006.html
Copyright © 2011-2022 走看看