- 浏览: 346921 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
hanmiao:
如果接口里的方法声明会抛出某些异常,那么在使用lambda 表 ...
Java8中Lambda表达式的10个例子 -
彭成林:
我试了一下,,虽然配置这个插件简单,,但是验证码的效果真是不咋 ...
一个Struts2验证码生成插件JCaptcha4Struts2的使用经历 -
桃汁天天:
非常感谢 为我们剩下了许多研究时间
ExtJs中根据后台数据动态创建表格列及其数据 -
jobar:
mistake 写道var resultSetId = typ ...
ExtJs中根据后台数据动态创建表格列及其数据 -
mistake:
var resultSetId = type === 'con ...
ExtJs中根据后台数据动态创建表格列及其数据
线程转储就是在jvm中所有活动的线程的一个列表,线程转储对于分析应用程序瓶颈和死锁情况非常有帮助。
在java程序中有两种常用的方法可以让我们生成线程转储,这些方法对于linux或者Unix操作系统来说是有效的,window情况稍有不同。
1. VisualVM :
我们可以使用VisualVM很容易的为任何java程序生成线程转储。只需要在运行的java进程上点右键,选择“Thread Dump”选项来生成。
2 jstack:
java提供了自带的工具jstack,通过这个工具我们可以同样为java进程产生线程转储。通过两个步骤实现:
2.1 用“ps -eaf | grep java”命令找到java进程的PID。
2.2 用jstack PID 命令来生成线程转储到控制台,也可以用命令“jstack PID >> mydumps将输出保存到文件中mydumps中。
下面是输出的dump文件
可以从文件中看到线程转储是全部线程的罗列,每项显示了有关线程的信息,包括下面的几项信息:
线程名
线程优先级
线程ID:代表线程的唯一ID号
线程状态:提供了当前线程的状态信息,例如RUNNABLE, WAITING, BLOCKED。当分析线程死锁时查看阻塞的线程的状态跟他们获取锁相关的资源
线程调用堆栈:为线程提供了重要的堆栈信息。这儿我们可以看到线程获取锁以及它等待的锁的情况。
在java程序中有两种常用的方法可以让我们生成线程转储,这些方法对于linux或者Unix操作系统来说是有效的,window情况稍有不同。
1. VisualVM :
我们可以使用VisualVM很容易的为任何java程序生成线程转储。只需要在运行的java进程上点右键,选择“Thread Dump”选项来生成。
2 jstack:
java提供了自带的工具jstack,通过这个工具我们可以同样为java进程产生线程转储。通过两个步骤实现:
2.1 用“ps -eaf | grep java”命令找到java进程的PID。
2.2 用jstack PID 命令来生成线程转储到控制台,也可以用命令“jstack PID >> mydumps将输出保存到文件中mydumps中。
下面是输出的dump文件
可以从文件中看到线程转储是全部线程的罗列,每项显示了有关线程的信息,包括下面的几项信息:
线程名
线程优先级
线程ID:代表线程的唯一ID号
线程状态:提供了当前线程的状态信息,例如RUNNABLE, WAITING, BLOCKED。当分析线程死锁时查看阻塞的线程的状态跟他们获取锁相关的资源
线程调用堆栈:为线程提供了重要的堆栈信息。这儿我们可以看到线程获取锁以及它等待的锁的情况。
2014-02-25 14:23:57 Full thread dump Java HotSpot(TM) Client VM (23.25-b01 mixed mode, sharing): "RMI TCP Connection(6)-141.206.218.103" daemon prio=6 tid=0x03d34400 nid=0xe48 runnable [0x0478f000] java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:150) at java.net.SocketInputStream.read(SocketInputStream.java:121) at java.io.BufferedInputStream.fill(BufferedInputStream.java:235) at java.io.BufferedInputStream.read(BufferedInputStream.java:254) - locked <0x28f543f8> (a java.io.BufferedInputStream) at java.io.FilterInputStream.read(FilterInputStream.java:83) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:724) Locked ownable synchronizers: - <0x28f54580> (a java.util.concurrent.ThreadPoolExecutor$Worker) "RMI TCP Connection(5)-141.206.218.103" daemon prio=6 tid=0x03e40c00 nid=0x1f98 runnable [0x047df000] java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:150) at java.net.SocketInputStream.read(SocketInputStream.java:121) at java.io.BufferedInputStream.fill(BufferedInputStream.java:235) at java.io.BufferedInputStream.read(BufferedInputStream.java:254) - locked <0x28efb0a0> (a java.io.BufferedInputStream) at java.io.FilterInputStream.read(FilterInputStream.java:83) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:724) Locked ownable synchronizers: - <0x28e74b30> (a java.util.concurrent.ThreadPoolExecutor$Worker) "JMX server connection timeout 16" daemon prio=6 tid=0x03e38c00 nid=0x1b84 in Object.wait() [0x043af000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x28e76e38> (a [I) at com.sun.jmx.remote.internal.ServerCommunicatorAdmin$Timeout.run(ServerCommunicatorAdmin.java:168) - locked <0x28e76e38> (a [I) at java.lang.Thread.run(Thread.java:724) Locked ownable synchronizers: - None "RMI Scheduler(0)" daemon prio=6 tid=0x03e30000 nid=0x464 waiting on condition [0x046bf000] java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x28de9928> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2082) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1090) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:807) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:724) Locked ownable synchronizers: - None "RMI TCP Connection(1)-141.206.218.103" daemon prio=6 tid=0x03e28000 nid=0x1e54 in Object.wait() [0x045de000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x28e77088> (a com.sun.jmx.remote.internal.ArrayNotificationBuffer) at com.sun.jmx.remote.internal.ArrayNotificationBuffer.fetchNotifications(ArrayNotificationBuffer.java:449) - locked <0x28e77088> (a com.sun.jmx.remote.internal.ArrayNotificationBuffer) at com.sun.jmx.remote.internal.ArrayNotificationBuffer$ShareBuffer.fetchNotifications(ArrayNotificationBuffer.java:227) at com.sun.jmx.remote.internal.ServerNotifForwarder.fetchNotifs(ServerNotifForwarder.java:275) at javax.management.remote.rmi.RMIConnectionImpl$3.run(RMIConnectionImpl.java:1289) at javax.management.remote.rmi.RMIConnectionImpl$3.run(RMIConnectionImpl.java:1287) at javax.management.remote.rmi.RMIConnectionImpl.fetchNotifications(RMIConnectionImpl.java:1293) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322) at sun.rmi.transport.Transport$1.run(Transport.java:177) at sun.rmi.transport.Transport$1.run(Transport.java:174) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:173) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:724) Locked ownable synchronizers: - <0x28e77400> (a java.util.concurrent.ThreadPoolExecutor$Worker) "RMI TCP Accept-0" daemon prio=6 tid=0x03e0fc00 nid=0x18e0 runnable [0x0413f000] java.lang.Thread.State: RUNNABLE at java.net.DualStackPlainSocketImpl.accept0(Native Method) at java.net.DualStackPlainSocketImpl.socketAccept(DualStackPlainSocketImpl.java:131) at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398) at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:198) - locked <0x28de9b50> (a java.net.SocksSocketImpl) at java.net.ServerSocket.implAccept(ServerSocket.java:530) at java.net.ServerSocket.accept(ServerSocket.java:498) at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:52) at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:387) at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:359) at java.lang.Thread.run(Thread.java:724) Locked ownable synchronizers: - None "DestroyJavaVM" prio=6 tid=0x00acb800 nid=0x125c waiting on condition [0x00000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "t3" prio=6 tid=0x03cc3800 nid=0x1614 waiting for monitor entry [0x03f3f000] java.lang.Thread.State: BLOCKED (on object monitor) at lock.SyncThread.run(ThreadDeadlock.java:42) - waiting to lock <0x28de9cc8> (a java.lang.Object) - locked <0x28de9cd0> (a java.lang.Object) at java.lang.Thread.run(Thread.java:724) Locked ownable synchronizers: - None "t2" prio=6 tid=0x03cc3000 nid=0x1b3c waiting for monitor entry [0x03aaf000] java.lang.Thread.State: BLOCKED (on object monitor) at lock.SyncThread.run(ThreadDeadlock.java:42) - waiting to lock <0x28de9cd0> (a java.lang.Object) - locked <0x28de9d68> (a java.lang.Object) at java.lang.Thread.run(Thread.java:724) Locked ownable synchronizers: - None "t1" prio=6 tid=0x00a66400 nid=0x19e0 waiting for monitor entry [0x03f9f000] java.lang.Thread.State: BLOCKED (on object monitor) at lock.SyncThread.run(ThreadDeadlock.java:42) - waiting to lock <0x28de9d68> (a java.lang.Object) - locked <0x28de9cc8> (a java.lang.Object) at java.lang.Thread.run(Thread.java:724) Locked ownable synchronizers: - None "Service Thread" daemon prio=6 tid=0x00a60800 nid=0x118c runnable [0x00000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "C1 CompilerThread0" daemon prio=10 tid=0x00a5ec00 nid=0x14bc waiting on condition [0x00000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "Attach Listener" daemon prio=10 tid=0x00a5a400 nid=0x1e08 waiting on condition [0x00000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "Signal Dispatcher" daemon prio=10 tid=0x00a7fc00 nid=0x4d4 runnable [0x00000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "Finalizer" daemon prio=8 tid=0x00a37800 nid=0x10f4 in Object.wait() [0x03aff000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x28dea030> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) - locked <0x28dea030> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:189) Locked ownable synchronizers: - None "Reference Handler" daemon prio=10 tid=0x00a32c00 nid=0xeac in Object.wait() [0x03b8f000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x28de9918> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:503) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133) - locked <0x28de9918> (a java.lang.ref.Reference$Lock) Locked ownable synchronizers: - None "VM Thread" prio=10 tid=0x00a31800 nid=0x1474 runnable "VM Periodic Task Thread" prio=10 tid=0x00a61400 nid=0x1844 waiting on condition JNI global references: 181 Found one Java-level deadlock: ============================= "t3": waiting to lock monitor 0x03cc4d2c (object 0x28de9cc8, a java.lang.Object), which is held by "t1" "t1": waiting to lock monitor 0x00a36aac (object 0x28de9d68, a java.lang.Object), which is held by "t2" "t2": waiting to lock monitor 0x00a37744 (object 0x28de9cd0, a java.lang.Object), which is held by "t3" Java stack information for the threads listed above: =================================================== "t3": at lock.SyncThread.run(ThreadDeadlock.java:42) - waiting to lock <0x28de9cc8> (a java.lang.Object) - locked <0x28de9cd0> (a java.lang.Object) at java.lang.Thread.run(Thread.java:724) "t1": at lock.SyncThread.run(ThreadDeadlock.java:42) - waiting to lock <0x28de9d68> (a java.lang.Object) - locked <0x28de9cc8> (a java.lang.Object) at java.lang.Thread.run(Thread.java:724) "t2": at lock.SyncThread.run(ThreadDeadlock.java:42) - waiting to lock <0x28de9cd0> (a java.lang.Object) - locked <0x28de9d68> (a java.lang.Object) at java.lang.Thread.run(Thread.java:724) Found 1 deadlock.
发表评论
-
高性能web网站优化原则14——缓冲Ajax请求
2015-07-07 17:34 586参见:https://developer.yahoo.com/ ... -
高性能web网站优化原则13——配置ETag
2015-07-07 16:28 995什么事ETag HTTP协议规格 ... -
高性能web网站优化原则12——移除重复的脚本
2015-07-06 16:50 669参见:https://developer.yahoo.com/ ... -
高性能web网站优化原则11——避免重定向
2015-07-06 15:31 1561重定向(redirect)将用 ... -
高性能web网站优化原则10——精简JavaScript
2015-07-03 18:05 7661 精简压缩 精简是从代码中移除空格注释等不必要的字符以减少 ... -
高性能web网站优化原则9——减少DNS查找
2015-07-03 16:56 816百度百科对DNS的说明:D ... -
高性能web网站优化原则8——脚本和css放在外部引用,避免内联
2015-06-26 17:40 869将脚本或css放页面里面叫做内联,将脚本放一个单独的文件里,在 ... -
高性能web网站优化原则7——避免css表达式
2015-06-26 10:58 603参考:https://developer.yahoo.com/ ... -
高性能web网站优化原则6——把js脚本放在页面底部
2015-06-25 19:02 799在页面渲染时,js跟css渲染时的顺序恰好相反,浏览器会先下载 ... -
高性能web网站优化原则5——把css放在页面顶部
2015-06-23 18:07 632渐进式渲染 html页面渲染是一个渐进式的过程。当浏览器加载 ... -
高性能web网站优化原则4——利用gzip压缩组件
2015-06-19 15:14 1452从HTTP/1.1开始,web客户 ... -
高性能web网站优化原则3——增加Expires头
2015-06-18 16:15 508Expires头 浏览器使用cache来减少http请求 ... -
高性能web网站优化原则2——适当使用CDN(内容分发网络)
2015-06-18 09:23 789CDN的全称是Content Delivery Network ... -
高性能web网站优化原则1——尽可能的减少http请求
2015-06-17 17:19 1144原文参见:https://developer.yahoo.co ... -
jstat - Java Virtual Machine Statistics Monitoring Tool
2014-04-14 17:09 1024From http://docs.oracle.com/jav ... -
了解GC
2014-04-02 14:12 722每个搞java的都可能碰到 ... -
Java中的内存泄漏问题
2014-03-31 16:43 8751 什么是内存泄漏 Java中的内存泄漏指的是:有些对象不 ... -
性能调优利器
2014-03-12 11:06 5911 vmstat iostat netstat (监控工具) ... -
性能调优涉及到的几个指标
2014-03-11 13:55 882构建高性能的应用程序要求: 1 低延迟: 例如页面加载事件要很 ...
相关推荐
java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。...如果记录了类的直方图,它还提供了线程转储中的堆对象的概述。
Java线程转储分析器这是用Java编写的Java线程转储分析器。 执照Java Thread Dump Analyzer是根据,版权属于Spotify AB。本地测试npm installnpm test 使用npm 6.13.7和node v13.8.0测试。去做在“同步器”部分中,使...
Java线程转储分析器 这是用Java编写的Java线程转储分析器。 它基于的。 有关用法的其他信息,请参见 。 执照 Java Thread Dump Analyzer是根据。 版权所有2014-2016 Spotify AB 版权所有2016-2018 MP Objects BV...
Java线程转储(Thread Dump)是诊断Java应用程序性能问题和异常情况的重要工具。它提供了一个运行中的Java应用中所有线程的快照,详细显示每个线程的状态、堆栈跟踪以及线程名称。线程状态包括RUNNABLE、BLOCKED、...
1. **生成线程转储**:在Java应用程序中,可以通过JConsole、VisualVM或者发送特定信号(如`kill -3 <pid>`)来生成线程转储文件。 2. **加载转储文件**:启动TMDA,导入生成的线程转储文件。 3. **分析线程**:...
这是一个专门用于解析Java线程和监视器转储的工具,它能够帮助开发者识别和解决多线程应用程序中的死锁、阻塞和其他并发问题。该工具可以分析线程堆栈信息,展示每个线程的状态,包括运行、等待、阻塞等,并提供详细...
使用`LockViz`时,你需要先获取Java线程转储文件(通常以`.hprof`为扩展名),然后使用`LockViz`解析并生成可视化结果。这个过程可能涉及到命令行操作或者集成到开发环境中,具体步骤根据不同的版本和使用环境可能会...
分析Java线程转储对于诊断Java应用程序中的性能问题、死锁、线程阻塞等状况至关重要。 在《Analyzing Java Thread Dumps.pdf》和《Java Thread Dumps 分析.pdf》这两份文档中,你可以深入理解以下几个关键知识点: ...
3. **线程转储(Thread Dump)**:通过生成线程转储文件,开发者可以查看在特定时刻所有线程的详细信息,包括调用栈,这有助于定位导致阻塞或挂起的问题。 4. **堆转储(Heap Dump)**:当遇到内存泄漏问题时,可以使用...
线程转储是Java虚拟机(JVM)在特定时刻生成的一种快照,其中包含了应用程序中所有活动线程的状态信息,这对于诊断多线程程序中的性能问题和死锁情况至关重要。 TDA全称为Thread Dump Analyzer,它能够帮助开发者深入...
监视JVM线程并在给定时间内阻塞线程时保存线程转储。 用法 从下载jar 将其添加到要监视的应用程序的命令行中: java -javaagent:jvm-monitoring-agent-0.9.0.jar=threshold=1000,debug ...rest of command 配置...
线程转储是JVM在特定时刻生成的一种快照,它包含了所有运行中线程的状态信息,这对于诊断Java应用程序的性能问题、死锁或线程阻塞等问题非常有帮助。TDA工具能够帮助开发者更有效地理解和解析这些复杂的信息。 首先...
该工具允许用户加载,可视化和分析Visual VM生成的Java线程转储。 请参阅Wiki,以获取快速入门指南和教程。
- **Thread Dump**: 当应用出现性能问题或死锁时,可以生成线程转储快照进行分析。 - **线程池**: 使用`ExecutorService`创建线程池,可以有效控制并发数量,避免频繁创建销毁线程的开销。 - **并发编程的最佳...
面试时还可能需要解释“什么是线程转储(Thread Dump)”以及如何在不同的操作系统上获取线程转储信息,比如在UNIX系统上使用kill -3命令,而在Windows系统上则使用CTRL+Break。 理解Java中的并发和多线程编程的...
堆栈生成.NET托管进程线程转储的简单实用程序(类似于Java jstack),即所有托管线程的当前stacktrace。 基于可从获得的Managed Stack Explorer中的代码。 要运行它,请使用nstack.exe <PID> 。 它将所有托管线程的...
1. **生成线程转储**:在Java应用中,可以通过JConsole、JVisualVM或其他工具生成线程转储文件。 2. **导入线程转储**:将生成的dump文件导入TDA,工具会自动解析文件内容。 3. **分析线程状态**:查看线程颜色标识...
10) **线程转储分析**:线程转储可以显示所有线程的状态,用于调试死锁和其他线程问题。分析线程转储包括查找阻塞、挂起或死锁的线程,以及理解每个线程的堆栈跟踪。 11) **`start()`与`run()`的差异**:`start()`...
线程转储,通常也被称为线程快照,是Java应用程序在特定时刻所有线程的状态记录,这对于诊断和解决多线程应用中的死锁、线程阻塞等问题非常有用。 TAD插件的安装过程相对简单,一般遵循以下步骤: 1. 下载TAD插件...