参考: http://blog.csdn.net/defonds/article/details/4848853
查看当前 jvm有那写线程在执行, 代码如下, 另外附件给了 个jar包,可以直接运行
java -jar findThrea-client.jar
运行结果如下: 写道
current threadName [Reference Handler] priority[10] group[java.lang.ThreadGroup[name=system,maxpri=10]] parentGroup[null]
current threadName [Finalizer] priority[8] group[java.lang.ThreadGroup[name=system,maxpri=10]] parentGroup[null]
current threadName [Signal Dispatcher] priority[9] group[java.lang.ThreadGroup[name=system,maxpri=10]] parentGroup[null]
current threadName [main] priority[5] group[java.lang.ThreadGroup[name=main,maxpri=10]] parentGroup[java.lang.ThreadGroup[name=system,maxpri=10]]
current threadName [Finalizer] priority[8] group[java.lang.ThreadGroup[name=system,maxpri=10]] parentGroup[null]
current threadName [Signal Dispatcher] priority[9] group[java.lang.ThreadGroup[name=system,maxpri=10]] parentGroup[null]
current threadName [main] priority[5] group[java.lang.ThreadGroup[name=main,maxpri=10]] parentGroup[java.lang.ThreadGroup[name=system,maxpri=10]]
原码:
package com.younglibin; public class FindThread { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Thread[] slackList = findAllThreads(); if (null == slackList) { System.out.println("current jvm no thread."); } else { for (Thread t : slackList) { System.out .println(String .format("current threadName [%s] priority[%s] group[%s] parentGroup[%s] ", t.getName(), t.getPriority(), t .getThreadGroup(), t .getThreadGroup().getParent())); } } } public static Thread[] findAllThreads() { ThreadGroup group = Thread.currentThread().getThreadGroup(); ThreadGroup topGroup = group; // 遍历线程组树,获取根线程组 while (group != null) { topGroup = group; group = group.getParent(); } // 激活的线程数加倍 int estimatedSize = topGroup.activeCount() * 2; Thread[] slackList = new Thread[estimatedSize]; // 获取根线程组的所有线程 int actualSize = topGroup.enumerate(slackList); // copy into a list that is the exact size Thread[] list = new Thread[actualSize]; System.arraycopy(slackList, 0, list, 0, actualSize); return list; } }
相关推荐
本文将详细讲解如何查看JVM中的线程活动情况,并提供相关示例代码。 首先,Java提供了`java.lang.management.ThreadMXBean`接口,它是管理JVM线程的管理接口。通过这个接口,我们可以获取线程的各种信息,包括线程...
Java作为一种广泛应用于分布式系统开发的编程语言,其内部机制,尤其是JVM对于线程的管理和资源的同步,是确保程序高效、稳定运行的关键。 #### 线程与多线程 线程是操作系统能够进行运算调度的最小单位,它被包含...
JVM在创建线程时会分配一个Thread实例,该实例的threadStatus字段保存了线程的当前状态,反映了线程在Java虚拟机中的行为。 在Java虚拟机中,线程状态的转换是严格控制的,每个状态转换都对应于特定的线程行为和...
通过查看线程堆栈信息,我们可以了解线程当前的活动,例如哪个线程持有Monitor,哪些线程在等待,以及等待的原因。这有助于我们识别死锁、活锁或资源争抢等问题,并采取相应的解决策略。 总结来说,JVM线程分析主要...
### JVM运行时数据区详解 #### 一、概述 Java虚拟机(JVM)作为Java程序的运行环境,定义了一系列用于程序执行过程中使用的数据区域。这些数据区域在JVM启动时创建,在JVM退出时销毁。其中一些数据区域是线程独立...
- 如果将一个正在运行的线程设置为守护线程,其状态会立即改变,不影响当前执行的任务。 如何判断线程是否为守护线程? Java中可以使用`Thread.isDaemon()`方法来检查一个线程是否为守护线程。这个方法返回一个布尔...
堆存储对象实例,方法区存放类信息,程序计数器记录当前线程执行的指令地址,虚拟机栈保存每个方法的局部变量、操作数栈等,本地方法栈为JNI调用的本地方法服务。 3. 指令集:JVM使用一套基于栈的指令集,这些指令...
Java虚拟机(JVM)是Java程序运行的基础,它提供了执行字节码的环境,确保了跨平台的兼容性。在面试中,JVM和多线程是常见的话题,尤其对于Java开发者来说,理解这两部分至关重要。 1. **JVM内存模型**: JVM内存...
其中,堆内存存储对象实例,栈内存存储基本类型和对象引用,方法区存储类信息,本地方法栈服务于Java Native Interface(JNI),程序计数器记录当前线程执行的字节码指令地址。 - **垃圾回收机制**:JVM自动管理内存...
一旦启动,JProfiler11将连接到当前运行的JVM实例,实时展示内存使用情况。它的主要功能包括: 1. **内存分配和泄漏检测**:JProfiler11能详细追踪对象的创建、存活和销毁过程,帮助识别内存泄漏。通过查看对象分配...
2. **解析javacore**:IBM提供了专门的工具,如`IBM Heap Analyzer`,它可以解析javacore文件,显示当前活动线程的状态,包括阻塞、等待、运行等,以及线程的调用堆栈,帮助我们定位可能的死锁或资源竞争问题。...
JVM运行机制复杂且至关重要,涉及到内存分配、垃圾回收、类加载机制等多个方面。冯立全在分享中重点介绍了JVM运行机制,尤其强调了运行时数据区域的布局、Class文件的结构、字节码技术、类加载机制以及垃圾回收算法...
通过调整JVM参数,我们可以控制堆大小、垃圾收集策略、线程栈大小等,以达到最佳的运行效果。例如,通过-Xms和-Xmx设置堆内存大小,-XX:+UseG1GC选择垃圾收集器等。 总结来说,JVM是Java编程的重要组成部分,它的...
### JVM运行时数据区 #### 程序计数器 程序计数器是当前线程所执行的字节码的行号指示器,是线程私有的内存区域。由于Java是多线程并发执行的,每个线程都需要有一个独立的程序计数器,以便记录线程切换后继续执行...
3. **线程状态**:`jvm-mon`可展示当前运行的线程数量及状态,如RUNNABLE、WAITING、TIMED_WAITING等,这对于排查线程阻塞和死锁问题非常有帮助。 4. **类加载统计**:显示已加载的类数量,帮助分析类加载是否正常...
- 可以通过访问`http://<host>:<port>/manager/status`页面查看当前JVM内存使用情况。 #### 六、总结 通过上述步骤,您可以有效地调整Tomcat的JVM内存设置,从而提高应用性能和稳定性。请注意,这些设置需要根据...
6. **收集和比较快照**:使用"Snapshot"功能,可以记录当前JVM的状态,以便于不同时间点的比较,找出变化趋势。 通过对JVM的深入理解和利用gp-jvm-visualvm这样的工具,开发者不仅可以解决实际遇到的问题,还能提升...
- **PC 寄存器**:用于存储当前线程正在执行的方法的指令地址。 - **局部变量区**:存放方法参数和局部变量。 - **操作数栈**:用于支持虚拟机中的字节码指令执行。 - **栈帧**:代表一个线程执行的方法。 - **JVM ...