启动Java程序时JVM中的线程

来源:互联网 发布:人人会计软件 编辑:程序博客网 时间:2024/06/05 15:54

今天用 Eclipse Memory Analyzer 分析一个Heap OutOfMemoryError,意外发现 除了 main线程外,还有其他四个线程,如图



(1) main

无需赘述,程序主线程,Eclipse Debug时也会看到

(2) Signal Dispatcher

处理操作系统底层信号

参考:http://www.ibm.com/developerworks/java/library/i-signalhandling/

(3) Attach Listener

JVM中提供了一个供外界访问JVM内部情况的接口,在第一次访问的时候创建这个现成。

Eclipse需要用到,实际上,可能,大概,Eclipse就是以此为基础的

不知道如果不通过Eclipse运行此程序,Attach Listener还会不会创建

参考:http://openjdk.java.net/groups/hotspot/docs/Serviceability.html#battach

(4) Reference Handler

java.lang.ref.Reference 中启动,demaon线程,不停检查reference的pending-List是否有值,如果有,把list里的reference enqueue

(5) Finalizer

java.lang.ref.Finalizer 中启动,demaon线程,不停检查ReferenceQueue中是否有值,如果有,finalize之


======================================================================================

不过,通过 任务管理器和pslist却发现进程中有10个线程:



不知其他5个是什么。。。


=======================2012-06-02=======================

通过jvisualvm可清晰地看出这十个线程是什么。

测试程序:

// user jvisualvmpublic class JVMThreadsCount {public static void main(String[] args) throws InterruptedException {while (true) {Thread.sleep(1000);}}}

通过jvisualvm的线程观察如下:


可以看出,除了上文所述之5个线程,另外5个线程分属于JMX与RMI