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

在写Java程序时,通常我们管只有一个main函数(而没有别的Thread或Runnable的程序)叫单线程程序。但是我们写的这个所谓的单线程程序只是JVM这个程序中的一个线程,JVM本身是一个多线程的程序,至少得有一个垃圾收集器线程吧。

刚装了一个NetBeans6.0,里面带了一个分析器包,于是写了一个HelloWorld程序,检验了一下JVM一启动,里面会有几个线程:

结果是:除了我的main线程以外,还有四个线程:

  • Finalizer 线程:在垃圾回收之前执行“对象完成”的Java系统线程;
  • Signal Dispatcher 线程:为JVM处理本地操作系统信号的Java系统线程;
  • Reference Handler 线程:将挂起的对象放到队列中的高优先级Java系统线程。
  • Attach Listener 线程:用户线程。

我个人的猜测是:

1、Finalizer 线程的任务就是调用finalize()方法来进行垃圾回收。

2、Signal Dispatcher 线程的任务就是处理操作系统方面的东西,屏蔽操作系统,使Java达到跨平台的事儿应该是它干的。

3、Reference Handler线程的任务就是将一个不用的对象打上标记,放到回收对象的队列中,以便于Finalizer线程来进行释放内存操作。

4、最后一个 Attach Listener 线程:这个应该是我的Java Profile线程了。跟JVM没有关系。

所以,综上分析可得出:当一个最简单的Java程序启动时,JVM除了我们的main线程外,还会启动3个线程。

时间: 2024-10-12 22:58:28

一个JVM进程启动后里面有几个线程的相关文章

JVM进程启动会启动哪些进程?

首先要明白一点:JVM本身是一个多线程的程序,和我们编写的java应用程序一样,当JVM启动执行时就是在操作系统中启动了一个JVM进程.我们编写的java单线程或多线程应用程                                 序都是在JVM这个程序中作为一个或多个线程运行. 每当使用java命令执行一个带main方法的类时,就会启动JVM(应用程序),实际上就是在操作系统中启动一个JVM进程,JVM启动时,必然会创建以下5个线程: 1-main                   

你知道java的main 方法启动后,会有多少个线程吗?

你知道java的main 方法启动后,会有多少个线程吗? package com; import java.util.stream.Stream; /** * 你知道java的main 方法启动后,会有多少个线程吗? */ public class ThreadTest { public static void main(String[] args) throws InterruptedException { Thread mainThread = Thread.currentThread();

总结一个主进程启动子进程,删除主进程文件和目录的问题

首先,我们启动子进程的时候,要修改子进程的工作目录. ProcessStartInfo pi = new ProcessStartInfo(fileName, arguments) { WorkingDirectory = Path.GetTempPath() }; pp.StartInfo = pi; pp.Start(); 这里我把工作目录随便指定了一个地方,目的是防止子进程默认继承了主进程的工作目录.如果你省了这一个地方,只要子进程开着,那它的工作目录就和主进程的工作目录是一样的,结局就是

[Elixir002]节点启动后自动连接其它节点

问题: 如何指定一个节点在启动后自动连接到别的节点上? 这个我们要使用到sys.config,这是erlang的配置文件,这个文件一般都是$ROOT/releases/Vsn下 1. 首先我们要先启动一个master节点,Node.list可以看到当前节点并没有连接到任何节点 iex --cookie secret --name [email protected] Erlang/OTP 18 [erts-7.2.1] [source] [64-bit] [smp:4:4] [async-thre

Android Zygote进程启动分析

dvm,app进程,linux进程三者关系 DVM指 dalivk 的虚拟机.每一个 Android 应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik 虚拟机实例.而每一个 DVM 都是在 Linux 中的一个进程,所以说可以认为是同一个概念 Zygote进程与app进程关系 Zygote是java层的进程即它也拥有一个独立的Dalvik 虚拟机实例,它是被linux层的第一个用户空间Init进程所启动的,它的主要作用就是用来孵化app进程和系统进程 fork一个app进程,是通过

使用jps查看JVM进程信息

VM进程状态工具 - 列出目标系统上已检测的HotSpot Java虚拟机进程信息.可直接在装有java运行环境的Windows 或者 Linux机器上使用命令行执行jps命令.一个典型的应用场景,例如你不知道这台机器上运行的java程序所在的位置,或者不了解它启动时的一些参数设置,便可使用jps命令查看. 语法:jps [ options ] [ hostid ] option可选参数: -q : 输出JVM进程ID-m:输出JVM启动时传递给main()函数的参数,嵌入式的JVM可能参数为n

JVM进程jar包加载分析

有时在一个应用中,会依赖很多的jar包,难免会出现引用不同jar包中的同名类,或者jar包冲突,这时搞清楚: JVM启动时加载了哪些jar包 或者一个类来自哪个jar中来就非常重要了. 一.查看JVM加载了哪些jar包 启动JVM,通过如下命令获取进程号: jps -lm 1 其中参数: -l:输出main所在类的全名,如果执行的是jar包,则输出jar包路径 -m:输出jvm进程启动时传递给main函数的参数 jps还有参数-v:输出jvm进程启动时JVM参数. 使用如下命令: jinfo +

[转帖]Linux ps 命令查看进程启动及运行时间

ps -eo pid,lstart,etime,cmd |grep dotnet |grep -v grep https://www.cnblogs.com/weifeng1463/p/8807849.html 都是脚本呢. 需要学习. 引言 同事问我怎样看一个进程的启动时间和运行时间,我第一反应当然是说用 ps 命令啦.ps aux或ps -ef不就可以看时间吗? ps aux选项及输出说明 我们来重新复习下ps aux的选项,这是类 BSD 风格的命令选项,因为不带“-”. 通过 man 可

从源码角度看Android系统SystemServer进程启动过程

copy frome :https://blog.csdn.net/salmon_zhang/article/details/93208135 SystemServer进程是由Zygote进程fork生成,进程名为system_server,主要用于创建系统服务. 备注:本文将结合Android8.0的源码看SystemServer进程的启动过程以及SystemServer进程做了哪些重要工作. 1. SystemServer进程启动的起点从<从源码角度看Android系统Zygote进程启动过