今天根据网上找的一些资料,配合自己的理解,将java程序启动时的一些命令如jps, jstack, 总结如下:(主要是留给自己看的)
线程名称 |
解释说明 |
Attach Listener |
Attach Listener 线程是负责接收到外部的命令,而对该命令进行执行的并且把结果返回给发送者。通常我们会用一些命令去要求jvm给我们一些反馈信息,如:java -version、jmap、jstack等等。如果该线程在jvm启动的时候没有初始化,那么,则会在用户第一次执行jvm命令时,得到启动。 |
Signal Dispatcher |
Attach Listener 线程的职责是接收外部jvm命令,当命令接收成功后,会交给signal dispather线程去进行分发到各个不同的模块处理命令,并且返回处理结果。signal dispather线程也是在第一次接收外部jvm命令时,进行初始化工作。 |
Compiler Thread |
用来调用JITing,实时编译装卸class。通常,jvm会启动多个线程来处理这部分工作。 |
Concurrent Mark-Sweep GC Thread |
并发标记清除垃圾回收器(就是通常所说的CMS GC)线程,该线程主要针对于老年代垃圾回收。启用该垃圾回收器,需要在jvm启动参数中加上: -XX:+UseConcMarkSweepGC |
DestroyJavaVM |
执行main()的线程在main执行完后调用JNI中的 jni_DestroyJavaVM() 方法唤起DestroyJavaVM 线程。JVM在服务器启动之后,就会唤起DestroyJavaVM线程,处于等待状态,等待其它线程(java线程和native线程)退出时通知它卸载JVM。线程退出时,都会判断自己当前是否是整个JVM中最后一个非daemon线程,如果是,则通知DestroyJavaVM 线程卸载JVM。 |
Finalizer |
这个线程也是在main线程之后创建的,其优先级为10,主要用于在垃圾收集前,调用对象的finalize()方法;关于Finalizer线程的几点:
1) 只有当开始一轮垃圾收集时,才会开始调用finalize()方法;因此并不是所有对象的finalize()方法都会被执行;
2) 该线程也是daemon线程,因此如果虚拟机中没有其他非daemon线程,不管该线程有没有执行完finalize()方法,JVM也会退出;
3) JVM在垃圾收集时会将失去引用的对象包装成Finalizer对象(Reference的实现),并放入ReferenceQueue,由Finalizer线程来处理;最后将该Finalizer对象的引用置为null,由垃圾收集器来回收;
4) JVM为什么要单独用一个线程来执行finalize()方法呢?如果JVM的垃圾收集线程自己来做,很有可能由于在finalize()方法中误操作导致GC线程停止或不可控,这对GC线程来说是一种灾难; |
Gang Worker |
JVM 用于做新生代垃圾回收(monir gc)的一个线程。#号后面是线程编号。 |
GC Daemon |
GC Daemon 线程是JVM为RMI提供远程分布式GC使用的,GC Daemon线程里面会主动调用System.gc()方法,对服务器进行Full GC。其初衷是当 RMI 服务器返回一个对象到其客户机(远程方法的调用方)时,其跟踪远程对象在客户机中的使用。当再没有更多的对客户机上远程对象的引用时,或者如果引用的“租借”过期并且没有更新,服务器将垃圾回收远程对象。 |
JDWP Event Helper Thread |
JDWP是通讯交互协议,它定义了调试器和被调试程序之间传递信息的格式。它详细完整地定义了请求命令、回应数据和错误代码,保证了前端和后端的JVMTI和JDI的通信通畅。该线程主要负责将JDI事件映射成JVMTI信号,以达到调试过程中操作JVM的目的。 |
Low Memory Detector |
这个线程是负责对可使用内存进行检测,如果发现可用内存低,分配新的内存空间。 |
Reference Handler |
JVM在创建main线程后就创建Reference Handler线程,其优先级最高,为10,它主要用于处理引用对象本身(软引用、弱引用、虚引用)的垃圾回收问题。 |
Surrogate Locker Thread (CMS) |
这个线程主要用于配合CMS垃圾回收器使用,它是一个守护线程,其主要负责处理GC过程中,Java层的Reference(指软引用、弱引用等等)与jvm 内部层面的对象状态同步。 |
VM Thread |
JVM里面的线程母体,根据hotspot源码(vmThread.hpp)里面的注释,它是一个单例的对象(最原始的线程)会产生或触发所有其他的线程,这个单个的VM线程是会被其他线程所使用来做一些VM操作(如清扫垃圾等)。
在VMThread 的结构体里有一个VMOperationQueue列队,所有的VM线程操作(vm_operation)都会被保存到这个列队当中,VMThread 本身就是一个线程,它的线程负责执行一个自轮询的loop函数(具体可以参考:VMThread.cpp里面的void VMThread::loop()) ,该loop函数从VMOperationQueue列队中按照优先级取出当前需要执行的操作对象(VM_Operation),并且调用VM_Operation->evaluate函数去执行该操作类型本身的业务逻辑。 |
相关推荐
本文将深入解析Java线程的相关知识点,包括线程的定义、创建、状态管理、线程同步和安全问题。 1. **线程定义** 在Java中,线程是进程中的单一顺序控制流,是程序执行的基本单元。线程在进程的上下文中运行,共享...
### JAVA教程解析Java的多线程机制 #### 进程与应用程序的区别 进程(Process)在多用户、多任务操作系统环境中被定义为应用程序在内存环境中基本执行单元的概念。以Unix操作系统为例,进程是该系统环境中的基本...
Java Thread多线程全面解析涵盖了Java编程中关于线程的重要概念和实践技巧。在Java中,多线程是并发编程的基础,允许程序同时执行多个任务,提高系统资源利用率和应用程序的响应速度。 线程的生命周期包括五个基本...
### JAVA中的单线程与多线程概念解析 #### 单线程的理解 在Java编程环境中,单线程指的是程序执行过程中只有一个线程在运行。这意味着任何时刻只能执行一个任务,上一个任务完成后才会进行下一个任务。单线程模型...
【Java多线程解析】 Java中的多线程技术是编程中的一个重要领域,它允许程序同时执行多个任务,从而更高效地利用CPU资源。在Java中,多线程主要用于模拟现实世界中的并发行为,例如"生产者-消费者"模型。本文将深入...
1. **多线程基础**:论文可能会首先介绍多线程的基本概念,解释为什么在JAVA中需要使用多线程,以及多线程如何提升程序的执行效率。这部分内容可能会涉及到线程的创建、启动、同步和通信等基础知识。 2. **JAVA多...
此外,Java还提供了线程的状态模型(新建、就绪、运行、阻塞和死亡)以及线程的优先级管理,以控制线程的执行顺序。 接着,我们来探讨线程池。线程池是管理线程的一种策略,通过预先创建一定数量的线程并复用它们,...
### Java多线程操作数据库:深入解析与应用 在当今高度并发的应用环境中,Java多线程技术被广泛应用于处理数据库操作,以提升系统的响应速度和处理能力。本文将基于一个具体的Java多线程操作数据库的应用程序,深入...
通过合理利用多线程技术,可以显著提升程序的运行效率和响应速度。在Java中,可以通过继承`Thread`类或者实现`Runnable`接口来创建线程。 ##### 3. 多线程分页查询方案设计 针对数据量较大的场景,本文介绍的多...
### 基于Java的多线程网络爬虫设计与实现 #### 概述 本文档探讨了在Java环境下设计与实现多线程网络爬虫的技术细节与实践方法。网络爬虫(Web Crawler),是一种自动抓取互联网上网页信息的程序或自动化脚本,其...
java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM...它可以在线程之间进行区分,以寻找相似之处,并具有“长运行线程”检测。如果记录了类的直方图,它还提供了线程转储中的堆对象的概述。
* 可运行态 (Runnable):start() 方法产生运行线程所必须的资源,调度线程执行,并且调用线程的 run() 方法。在这时线程处于可运行态。该状态不称为运行态是因为这时的线程并不总是一直占用处理机。 * 非运行态 (Not...
Java线程是编程中不可或缺的一部分,特别是在开发多任务应用程序时,理解线程的运作机制至关重要。线程可以被看作是进程内部的一个独立执行单元,它拥有自己的执行上下文,包括执行堆栈和程序计数器,使得它可以独立...
【描述】基于tesseract的多线程OCR服务器的JAVA实现Eclipse工程,可以运行 这个项目是用Java开发的,使用Eclipse作为集成开发环境,这意味着开发者或用户可以直接导入该项目并进行运行。Eclipse是一个流行的Java...
Java中的单线程和多线程是编程中的关键概念,特别是在服务器端开发中。了解它们的原理和应用对于构建高效、可扩展的客户端-服务器应用至关重要。以下是对这些概念的详细解析。 首先,我们来谈谈单线程。在Java中,...
Java多线程网络爬虫是一种高效地从互联网上抓取数据的技术,特别是在处理大量网页时,多线程能显著提高爬虫的效率。本项目以时光网(Mtime)为例,展示如何使用Java实现这样的爬虫。时光网是一个提供电影、电视剧、...
本文将详细探讨Java中的线程和进程的区别,以及它们在程序设计和运行时的角色和重要性 理解线程和进程的区别对于Java程序员来说至关重要。线程提供了一种高效的方式来实现并发执行,而进程则是操作系统资源分配的...
Java多线程导出Excel是处理大数据量时的一种高效策略,尤其在面对千万级别的数据时。传统的Apache POI库在处理大规模数据时可能会遇到栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)等问题,因为这些...
3. **分析线程状态**:TDA会对上传的线程堆栈进行解析,展示线程的详细信息,如线程状态(运行、阻塞、等待、死亡等)、持有锁的情况、线程执行的代码路径等。 TDA的主要功能包括: - **线程状态可视化**:清晰地...