在开发调测过程遇到线程非正常阻塞的情况是在所难免的, 有时是死锁, 有时是不正确的程序逻辑. 例如:
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"没有退出:
![](http://dl.iteye.com/upload/attachment/402723/7c0ebef3-8ad0-3410-b8a6-336cf1265610.jpg)
线程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":
![](http://dl.iteye.com/upload/attachment/402728/06295654-a17c-36af-aa90-57b06e5ed66b.jpg)
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0040/2723/7c0ebef3-8ad0-3410-b8a6-336cf1265610-thumb.jpg)
- 大小: 16.2 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0040/2728/06295654-a17c-36af-aa90-57b06e5ed66b-thumb.jpg)
- 大小: 37.8 KB
分享到:
相关推荐
线程使用情况则揭示了可能的线程阻塞或死锁问题。 当LoadRunner施加压力测试时,通过JProfiler监控的数据,我们可以观察到系统在高负载下的表现。如果出现性能下降,如响应时间增加、错误率上升等,JProfiler的分析...
3. **线程和同步分析**:JProfiler可以展示线程状态,分析阻塞和死锁,这对于理解和解决并发问题非常关键。 4. **JVM配置和调优**:JProfiler提供了JVM参数的详细视图,我们可以根据分析结果调整JVM设置,优化应用...
1. 线程快照:捕捉线程状态,查找死锁和阻塞问题。 2. 线程时间线:查看线程活动的历史记录,理解执行模式。 3. 异常和同步分析:识别异常抛出和线程同步热点。 **六、JVM配置** 1. JVM配置检查:评估JVM参数设置...
**JProfiler**是一款强大的Java应用程序性能分析工具,主要用于检测和优化Java应用的内存使用、CPU性能、线程活动、锁竞争、SQL查询性能等问题。它提供了丰富的可视化界面和详细的统计信息,帮助开发者深入理解并...
JProfiler的线程视图允许你查看当前运行的线程状态,包括线程的堆栈跟踪,帮助你理解线程间的交互和可能的阻塞点。 5. **可视化配置**:JProfiler允许用户自定义视图和仪表板,你可以根据需求选择和组合不同的视图...
通过阅读《JProfiler详细讲解与实例02.doc》文档,你可以更深入地了解这些功能的具体使用步骤和技巧,结合实际项目,提升你的Java性能优化能力。无论是开发新项目,还是优化已有应用,JProfiler都是一款不可或缺的...
3. **线程分析**:在“Threads”视图中,可以查看当前应用的所有线程状态,找出阻塞、等待或死锁的情况。 4. **数据库分析**:在“SQL”视图下,可以看到应用程序执行的所有SQL查询,包括查询次数、执行时间等,帮助...
【JProfiler 使用详解】 ...JProfiler 的强大之处在于它提供了一整套工具,使得开发者能够全面地理解和优化 Java 应用的性能,无论是内存管理、CPU 使用率还是线程同步问题,都能得到有效的分析和解决。
2. **线程分析**:查看线程状态,发现阻塞和等待情况,定位死锁问题。 3. **内存剖析**:包括Heap Walker,用于进行根分析以检测内存泄漏,以及快照对比,帮助识别不再使用的对象。 4. **类装载分析**:查看类装载和...
【JProfiler实例003.rar】是一个关于JProfiler使用的详细示例,主要涵盖了JProfiler工具在Java性能调优中的应用。JProfiler是一款强大的Java性能分析器,它提供了丰富的功能,帮助开发者深入理解Java应用程序的运行...
JProfiler是一款强大的Java性能分析工具,专为Java开发者设计,用于深入剖析应用程序的性能瓶颈,优化内存使用,检测线程问题,以及管理SQL查询等。这款工具提供了丰富的功能,帮助开发者在开发过程中及时发现并解决...
3. **线程分析**:在多线程环境中,线程死锁和阻塞是常见的问题。JProfiler7提供了线程视图,可以查看线程状态,检测和定位线程问题。 4. **Garbage Collection监测**:通过GC日志分析,可以了解垃圾回收的频率、...
JProfiler 是一个非常优秀的的 JVM 性能分析工具,可监视本地和远程的 JVM,适用于各种操作系统。 常用的功能有: 1、 监视堆内存占用情况和创建对象实例的数量,找出...3、 监视线程的阻塞与死锁 4、 监视 GC 的耗时。
JProfiler是一款强大的Java性能分析工具,它可以帮助开发者深入理解应用程序的内存使用、CPU消耗、线程活动以及各种JVM参数的影响。本教程将通过图文并茂的方式,配合Flash演示和实战案例,一步步教你如何熟练使用...
本文将深入探讨JProfiler的功能、使用方法及其在实际开发中的应用实例。 一、JProfiler简介 JProfiler是一款图形化界面的Java性能剖析器,能够提供内存泄漏检测、CPU性能分析、线程监控、Garbage Collection分析等...
在多线程环境中,死锁、竞态条件和线程阻塞等问题是常见的性能障碍。JProfiler提供线程可视化工具,展示所有线程的状态和调用堆栈,便于找出导致问题的原因。 4. **方法调用统计**: JProfiler可以收集方法调用的...
2. **线程分析**:线程是Java并发编程的基础,JProfiler的线程视图可以帮助开发者追踪线程状态,定位并解决死锁、活锁和阻塞问题。 3. **CPU剖析**:JProfiler能详细记录并分析每个方法的CPU使用时间,让开发者了解...
3. **线程分析**:实时监控线程状态,识别死锁和阻塞,提高多线程应用的稳定性。 4. **JVM设置**:提供JVM配置建议,帮助调整JVM参数以优化性能。 5. **GUI性能**:直观的用户界面,便于操作和理解分析结果。 6. ...
JProfiler是一款Java的性能监控工具。可以查看当前应用的对象、对象引用、内存、CPU使用情况、线程、线程运行情况(阻塞、等待等),同时可以查找应用内存使用得热点。
它提供线程快照,展示线程状态(如运行、等待、阻塞等),以及线程间的同步点,帮助诊断死锁和线程竞争问题。 四、JVM配置和调优 JProfiler不仅可以分析运行中的Java应用,还可以帮助调整JVM参数。它提供了一系列...