`
ryhome
  • 浏览: 44808 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

使用JProfiler跟踪阻塞线程的来源

阅读更多

在开发调测过程遇到线程非正常阻塞的情况是在所难免的, 有时是死锁, 有时是不正确的程序逻辑. 例如: 

package demo;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;

public class Main {
	private static final String DEATH_TAG = "exit";
	private static BlockingQueue<String> taskList = new LinkedBlockingQueue<String>();

	public static void main(String[] args)throws Exception {
		ExecutorService es = Executors.newCachedThreadPool();

		// 创建一个新线程,使用阻塞队列接收字符串, 如果不放入DEATH_TAG, 则一直进行处理
		es.submit(new Runnable() {

			@Override
			public void run() {
				while (true) {
					String s = null;
					try {
						s = taskList.take();
						if (DEATH_TAG.equals(s)) {
							System.out.println("bye");
							break;
						}
						System.out.println(s);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		});
//		taskList.put(DEATH_TAG);
		es.shutdown();
	}
}

 

如果程序结束前没有放入DEATH_TAG, 整个程序都不能正常退出, 就在那里一直阻塞.

 

出现了线程阻塞, 通常我们会使用jdk自带的jstack或者jconsole命令, 或者eclipse的debug模式, 查看当前线程堆栈情况. 可以看到是线程"pool-1-thread-1"没有退出:

线程stack信息:

 

"pool-1-thread-1" prio=6 tid=0x0b94fc00 nid=0x1708 waiting on condition [0x0bf1f000]
   java.lang.Thread.State: WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x03d2a980> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1925)
	at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:358)
	at demo.Main$1.run(Main.java:23)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)

 但是stack信息只有jdk自带类的方法调用过程, 我们并看不出到底是哪个对象创建了这个线程, 这阻碍了我们的调测.

 

这时, JProfiler的"Thread Views"功能则发挥了作用. 使用"Thread Views"可以清楚的看到每个线程的创建情况, 从而清楚的看到线程的创建者是"demo.Main":

  • 大小: 16.2 KB
  • 大小: 37.8 KB
0
0
分享到:
评论

相关推荐

    使用JProfiler结合LoadRunner寻找系统性能瓶颈

    线程使用情况则揭示了可能的线程阻塞或死锁问题。 当LoadRunner施加压力测试时,通过JProfiler监控的数据,我们可以观察到系统在高负载下的表现。如果出现性能下降,如响应时间增加、错误率上升等,JProfiler的分析...

    jprofiler9+中文使用手册

    - **线程分析**:实时查看线程状态,识别死锁和阻塞,有助于调试多线程问题。 - **JVM配置优化**:提供对JVM参数的详细视图,帮助调整垃圾回收器、类加载器等配置,提升系统性能。 - **GUI和事件分析**:监测...

    jprofiler4.32安装破解文件+jprofiler4.32使用教程

    3. **线程和同步分析**:JProfiler可以展示线程状态,分析阻塞和死锁,这对于理解和解决并发问题非常关键。 4. **JVM配置和调优**:JProfiler提供了JVM参数的详细视图,我们可以根据分析结果调整JVM设置,优化应用...

    JProfiler的安装及使用

    JProfiler是一款强大的Java性能分析工具,它可以帮助开发者深入洞察应用程序的性能瓶颈,包括内存管理、CPU使用、线程活动、类加载和虚拟机内部状态等多个方面。以下将详细介绍JProfiler的安装以及如何对本地和远程...

    JProfiler使用完全手册

    1. 线程快照:捕捉线程状态,查找死锁和阻塞问题。 2. 线程时间线:查看线程活动的历史记录,理解执行模式。 3. 异常和同步分析:识别异常抛出和线程同步热点。 **六、JVM配置** 1. JVM配置检查:评估JVM参数设置...

    jprofiler windows 使用方法介绍

    JProfiler是一款强大的Java性能分析工具,它可以帮助开发者深入洞察J2SE和J2EE应用程序的CPU使用、线程活动以及内存管理情况。本文将详细介绍如何在Windows环境下安装和使用JProfiler,包括本地监控和远程监控Tomcat...

    使用JProfiler 6.2 监控本地java程序运行

    这有助于识别多线程程序中的死锁和阻塞问题。 步骤七:方法调用统计 在“Method Calls”视图中,JProfiler可以显示所有方法的调用次数和耗时,帮助分析方法的执行效率。 步骤八:生成报告与导出数据 在分析过程中...

    JProfiler

    **JProfiler**是一款强大的Java应用程序性能分析工具,主要用于检测和优化Java应用的内存使用、CPU性能、线程活动、锁竞争、SQL查询性能等问题。它提供了丰富的可视化界面和详细的统计信息,帮助开发者深入理解并...

    jprofiler_linux_4_3_2.tar.gz 和 JProfiler在Linux上的安装和使用.rar

    JProfiler的线程视图允许你查看当前运行的线程状态,包括线程的堆栈跟踪,帮助你理解线程间的交互和可能的阻塞点。 5. **可视化配置**:JProfiler允许用户自定义视图和仪表板,你可以根据需求选择和组合不同的视图...

    IDEA-JProfiler插件+JProfiler软件.zip

    此外,JProfiler还支持线程监控,可以清晰地展示当前运行的线程和它们的状态,帮助我们定位死锁和阻塞问题。对于垃圾收集(GC)行为,JProfiler也提供了详细的监控,有助于理解和调整垃圾回收策略。 总的来说,IDEA...

    JProfiler11

    对于多线程应用,JProfiler11提供实时线程快照,显示线程状态和阻塞情况,有助于排查死锁和线程竞争问题。此外,它还支持线程挂起和恢复操作,便于进行调试。 **方法Profiling** JProfiler11支持方法级别的性能剖析...

    Jprofiler详细讲解与实例02.rar

    通过阅读《JProfiler详细讲解与实例02.doc》文档,你可以更深入地了解这些功能的具体使用步骤和技巧,结合实际项目,提升你的Java性能优化能力。无论是开发新项目,还是优化已有应用,JProfiler都是一款不可或缺的...

    JProfiler11安装包及注册机

    1. **CPU使用率分析**:JProfiler11能够详细地跟踪和分析应用程序的CPU使用情况,帮助开发者找到消耗资源最多的代码段,以便进行优化。 2. **内存分析**:对于内存泄漏的检测,JProfiler11提供了强大的内存分析模块...

    JProfiler使用说明

    3. **线程分析**:在“Threads”视图中,可以查看当前应用的所有线程状态,找出阻塞、等待或死锁的情况。 4. **数据库分析**:在“SQL”视图下,可以看到应用程序执行的所有SQL查询,包括查询次数、执行时间等,帮助...

    jprofiler7.2.X注册码 JProfiler入门教程(中文)

    6. **线程检测**:介绍如何查看线程状态,定位死锁和阻塞问题。 7. **其他功能**:包括JVM配置调整、事件记录、过滤器设置、性能测试等。 8. **最佳实践**:提供一些使用JProfiler时的建议,如何有效地利用工具...

    jprofiler网上牛人学习实战资料汇总3

    3. **线程与同步状态**:JProfiler提供了线程视图,可以查看所有运行中的线程,包括它们的状态(如运行、等待、阻塞等),这对于排查多线程问题非常有用。 4. **对象数量监控**:通过监控特定对象的数量,开发者...

    jprofiler 注册码+安装包

    在多线程环境中,死锁、竞态条件和线程阻塞等问题是常见的性能障碍。JProfiler提供线程可视化工具,展示所有线程的状态和调用堆栈,便于找出导致问题的原因。 4. **方法调用统计**: JProfiler可以收集方法调用的...

    JProfiler11.zip

    3. **线程分析**: 通过线程快照,开发者可以查看线程的状态和阻塞情况,找出死锁和其他并发问题。 4. **实时监测**: JProfiler11支持远程和本地连接,可以在运行时无侵入地监测应用程序,提供即时反馈,无需重启或...

    JProfiler9性能测试工具

    在多线程环境中,JProfiler9能够提供线程的实时视图,显示线程状态、阻塞情况以及锁的争用。这有助于调试死锁和其他并发问题,确保程序的稳定运行。 **4. 深度数据库监控** JProfiler9还集成有数据库连接池的监控,...

Global site tag (gtag.js) - Google Analytics