我有这么简单的java应用程序,它只是创建一个对象,在无限循环内调用所有这些函数
public class h {
public static void main( String[] args) {
while(true) {
B b = new B();
b.print();
}
}
}
class B {
public void print() {
System.out.println("Hello I'am class B");
}
}
打开jvisualvm
我看到JVM创建了10个线程,只有一个是主线程和9个守护进程。
这9个帖子的用途是什么?
注意:
输出java -version
:
java version "1.8.0_112"
Java(TM) SE Runtime Environment (build 1.8.0_112-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixed mode)
操作系统:Arch Linux 4.8.6-1
答案 0 :(得分:4)
Reference Handler
线程负责将垃圾收集器发现的Weak,Soft和Phantom引用添加到其注册的ReferenceQueues中。Finalizer
线程运行finalize
对象的方法准备完成。Signal Dispatcher
等待特定的OS信号并处理它们。特别是,它在SIGQUIT
上进行线程转储,并在SIGTERM
,SIGINT
,SIGHUP
上启动VM关闭过程。Attach Listener
线程支持Dynamic Attach机制。它侦听传入的动态连接连接并执行VM命令。例如,它由jstack
,jmap
和jcmd
实用程序使用。RMI TCP Accept
线程显然接受新的RMI连接。RMI TCP Connection
个线程服务于已建立的RMI连接。RMI Scheduler
运行RMI后台任务,例如DGC。JMX server connection timeout
线程在需要时终止JMX连接。 Reference Handler
,Finalizer
和部分RMI Scheduler
与GC相关。
答案 1 :(得分:1)
Reference Handler
用于处理Reference
s(SoftReference
,WeakReference
,PhantomReference
及其子类),Finalizer
个线程调用可终结对象的finalize()
方法。
JMX
和RMI
线程允许您观察正在运行的JVM。
我不知道其他两个主题是做什么的。
答案 2 :(得分:0)
我只认识到底部5个线程是java应用程序的默认线程。虽然每个JVM可以使用不同的线程来执行各种任务。如果一个Thread设置为deamon,则意味着JVM将关闭,尽管deamon-thread仍在运行。主要'线程是一个非deamon线程意味着,只要'主要'线程完成后,JVM将关闭。
关于他们的任务,基本上他们的名字告诉他们做了什么。 ' finallizer'线程是负责垃圾收集的(主要是)。 '附加听众','信号调度员'以及' ReferenceHandler'是执行其他后台任务的线程。