首先要明白一点: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

JVM进程启动会启动哪些线程?的更多相关文章

  1. 使用jps查看JVM进程信息

    VM进程状态工具 - 列出目标系统上已检测的HotSpot Java虚拟机进程信息.可直接在装有java运行环境的Windows 或者 Linux机器上使用命令行执行jps命令.一个典型的应用场景,例 ...

  2. 一个JVM进程启动后里面有几个线程

    在写Java程序时,通常我们管只有一个main函数(而没有别的Thread或Runnable的程序)叫单线程程序.但是我们写的这个所谓的单线程程序只是JVM这个程序中的一个线程,JVM本身是一个多线程 ...

  3. Java——检测其他线程的状态以及启动已死亡的线程

    这次这个的思路是在主类中维护一个map,map的key是线程名,value是线程的状态,然后创建周期执行的线程通过检测这个map来判断进程的状态,如果有死亡的进程就把该进程启动. 首先是主类,这里的m ...

  4. 进程监控工具supervisor 启动Mongodb

    进程监控工具supervisor 启动Mongodb 一什么是supervisor Superviosr是一个UNIX-like系统上的进程监控工具. Supervisor是一个Python开发的cl ...

  5. HBase——HMaster启动之二(HMaster线程的调用)

    紧接着上一节HMaster的构建完成.接下来会调用HMaster调用master.start(),master.join(). 由HMaster的继承关系,很明显,他是Runnable的子类.也就是说 ...

  6. JVM源码分析之一个Java进程究竟能创建多少线程

    JVM源码分析之一个Java进程究竟能创建多少线程 原创: 寒泉子 你假笨 2016-12-06 概述 虽然这篇文章的标题打着JVM源码分析的旗号,不过本文不仅仅从JVM源码角度来分析,更多的来自于L ...

  7. CentOS以守护进程的方式启动程序的另类用法daemon

    在Linux下如果以守护进程的方式启动程序,也就是后台运行,有几种方式,比如后面带&&,nuhop,那么在CentOS下可以使用daemon这个函数来启动,比如: daemon --p ...

  8. JavaWeb 服务启动时,在后台启动加载一个线程

    JavaWeb 服务启动时,在后台启动加载一个线程. 目前,我所掌握的一共有两种方法,第一种是监听(Listener),第二种是配置随项目启动而启动的Servlet. 下面对这两种方法做一简单的介绍, ...

  9. Linux 中设置进程通过 systemctl 启动

    对于某些脚本或需要启动命令的程序,可以通过创建 xx.service 服务文件来使用 systemctl 控制. 例如,对于 docker-compose,其后台启动且忽略输出信息的命令为: $ no ...

随机推荐

  1. CSS3_边框 border 详解_一个 div 的阴阳图

    (面试题) 怎么样通过 CSS 画一个三角形: 1. 元素的 width 和 height 设置为 0 2. 边框 足够大     3. 需要的三角形的部分, border-top-color 设置为 ...

  2. [LeetCode] Serialize and Deserialize N-ary Tree N叉搜索树的序列化和去序列化

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

  3. javascript的数组之map()

    map()方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的回调函数后返回的结果.新数组 // ES6 let numbers = [1, 5, 10, 15]; let doubles ...

  4. 课堂笔记及知识点----树(2018/10/24(pm))

    树 概念:由一个或多个(n≥0)结点组成的有限集合 T, 有且仅有一个结点称为根( root), 当 n>1时,其余的结点分为 m(m≥0)个互不相交的有限集合 T1,T2, …, Tm.每个集 ...

  5. Selenium 3----警告框处理+下拉框选择

    警告框处理 在WebDriver中处理JavaScript所生成的alert.confirm以及prompt十分简单,具体做法是使用 switch_to.alert 方法定位到 alert/confi ...

  6. 提高你的python:解释 yield 和 Generators(生成器)

    转自:http://www.oschina.net/translate/improve-your-python-yield-and-generators-explained 原文:http://www ...

  7. chrome浏览器另存为/上传附件崩溃

    x 前言 系统中有一个需要上传导入的功能,此功能在谷歌浏览器上传总是直接崩溃, 但是在火狐浏览器中就是好的. 自己想到的解决方案 谷歌浏览器版本号得问题?自己系统得问题? 谷歌浏览器卸载重新安装,还是 ...

  8. html中不常用但必须知道的标签

    1.<b>加粗</b> 为天地立心,为生民立命,为往圣继绝学,为万世开太平 2.<s>删除线</s> 为天地立心,为生民立命,为往圣继绝学,为万世开太平 ...

  9. windows下创建.gitignore

    网上搜索 .gitignore 的创建,很多linux上的,而且还一样,... 尝试了几次,windows可以这样写 .svn/ .settings/ .buildpath .project

  10. 旧版本的firefox 下载 和 安装(查找web元素路径) ---web 元素 自动化测试

    ftp.mozilla.orgpubfirefoxreleases   旧版下载地址   选择47版本     因为48后面的会进行插件校验    这样firepath安装不成功   安装文件:在百度 ...