怎样使用java jstack 命令诊断Java应用程序故障

java自带的工具Jstack截取进程中的堆栈信息
作者:jilodream
字体:[ ] 类型:转载 时间:
本文给大家记录的是java自带的工具Jstack截取进程中的堆栈信息的方法,非常的实用,有需要的小伙伴可以参考下。
  在Java软件的使用过程中,有时会莫名的出现奇怪的问题。而这些问题常常无法使用日志信息定位,这时我们就需要通过查看进程内部线程的堆栈调用关系来分析问题出在哪里。
  举个例子,当我们在做某个操作时,莫名的会弹出多个警告框,其中有些信息是正常的,有些则不是。对于这些错误的警告信息,我们该如何定位是哪个位置的代码出现了错误弹出的框呢? 我们就需要在弹框以后,去查看软件的各个线程,去查找究竟是哪个线程导致了该问题。可是有时因为环境、时间等问题,我们根本不能拿着IDE去调试, 只能通过工具软件拍下内存快照,然后分析内存信息。
今天介绍一款常用的工具:Jstack
Jstack 是JDK自带的工具,同时也是在JVM性能调优种出镜率非常高的一款软件。所以掌握它是非常有必要的。
Jstack可以生成JVM当前时间点的线程快照。
线程快照就是当前JVM内每一条线程正在执行的方法堆栈的集合。而生成线程快照的主要原因:
1、通过线程快照定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待
2、通过线程快照分析当前执行方法的调用关系来确定异常信息的源头。
它的使用非常简单:
(ps:前提是你已经装有带有Jstack的JDK。同时最好已经设置了环境变量。)
第一步: 通过Windows的任务管理器查看进程的PID
这里简单说下什么是PID:PID就是各进程的身份标识,他是在软件启动后,由操作系统分配的唯一的、用来标识进程身份的一个标识
在进程页签下,查看 & 选择列
勾选PID 然后确定
切到应用程序页签,选择要快照内存的程序。图片中选择的是Android Studio。点击右键转到进程。
这里就查看到 Android Studio对应的PID是 9952
第二步 打开命令行,执行Jstack程序
注意,如果没有成功添加环境变量,那么这里只能在Jstack的路径下执行,否则操作系统无法识别。
如图,这里一般有两个运行参数,用来拍取内存快照,
他们的含义如下:
-l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况
-m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)
我们一般使用-l参数就可以满足需要
格式如下 Jstack -l PID && 123.txt
ps 这里注意下 &&是重定向的意思,也就是将拍取到的快照定向输出到987.txt中。&& 的两次最好保持空格
这样我们就会在命令行路径下生成一个987.txt文件,同时将内存快照写入到这个文本中
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
找出某个 java 进程中 最耗费 cpu 的线程并跟踪一下它的堆栈 (假设该 java 应用的名字是 mrf-center)step1. 找出该 java 进程的 IDps -ef | grep mrf-center | grep -v grep这样就得到了进程 ID 是 21711那么该进程里面 哪个线程是最耗费 cpu 的呢?step2. 找出最耗费 cpu 的线程的 IDtop -Hp 21711&上图中 TIME 那一列就是耗费 cpu 的时间 而对应的 PID 就是线程的 ID假设我们对应到的线程 ID 是 21742 那么下一步就是将它转化为十六进制step3. 将线程 ID 转化为十六进制printf "%x\n" 21742得到的十六进制数是 54ee&step4. 然后使用 jstack 输出进程 21711 里面的 54ee 号线程的堆栈信息jstack 21711 | grep 54ee&可以看到 cpu 消耗在 PollIntervalRetrySchedulerThread 这个类的 Object.wait() 上面step5. 根据堆栈信息 定位到具体代码:&到了这一步 基本就可以翘着脚 开始给开发同学写 bug 了 &
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'使用 jstack 命令跟踪 java 应用的堆栈',
blogAbstract:'引帖:http://mp./s?__biz=MzA3OTgyMDcwNg==&mid=&idx=1&sn=1df38f390afc24ce8856a&chksm=87a45aabb0d3d3bdf9051bdf575feabf15e04da36da490c205c4c051&mpshare=1&scene=23&srcid=m9vNLrQI19PO0DQl#rd测试同学的任务是:找出某个 java 进程中 最耗费 cpu 的线程并跟踪一下它的堆栈 (假设该 java 应用的名字是 mrf-center)',
blogTag:'jstack,jvm',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:4,
publishTime:7,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}java线程僵死,帮忙看看 -jstack日志 - ITeye问答
多线程跑任务,任务为图片画table标签,就是把table标签转为图片
跑一段时间后会僵死所有线程,原因未知,附件为完整版日志。请帮忙看看
"taskExecutor-1" prio=10 tid=0x0c000 nid=0x447b in Object.wait() [0x0d3000]
&& java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.awt.MediaTracker.waitForID(MediaTracker.java:651)
- locked &0xf81a0& (a java.awt.MediaTracker)
at javax.swing.ImageIcon.loadImage(ImageIcon.java:278)
- locked &0xf81a0& (a java.awt.MediaTracker)
at javax.swing.ImageIcon.setImage(ImageIcon.java:344)
at javax.swing.text.html.ImageView.loadImage(ImageView.java:679)
at javax.swing.text.html.ImageView.refreshImage(ImageView.java:648)
at javax.swing.text.html.ImageView.sync(ImageView.java:620)
at javax.swing.text.html.ImageView.getPreferredSpan(ImageView.java:418)
at javax.swing.text.FlowView$LogicalView.getPreferredSpan(FlowView.java:715)
at javax.swing.text.FlowView.calculateMinorAxisRequirements(FlowView.java:216)
at javax.swing.text.html.ParagraphView.calculateMinorAxisRequirements(ParagraphView.java:128)
at javax.swing.text.BoxView.checkRequests(BoxView.java:918)
at javax.swing.text.BoxView.getMinimumSpan(BoxView.java:551)
at javax.swing.text.html.ParagraphView.getMinimumSpan(ParagraphView.java:261)
at javax.swing.text.BoxView.calculateMinorAxisRequirements(BoxView.java:886)
at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(BlockView.java:129)
at javax.swing.text.html.TableView$CellView.calculateMinorAxisRequirements(TableView.java:1769)
at javax.swing.text.BoxView.checkRequests(BoxView.java:918)
at javax.swing.text.BoxView.getMinimumSpan(BoxView.java:551)
at javax.swing.text.html.BlockView.getMinimumSpan(BlockView.java:361)
at javax.swing.text.html.TableView.checkSingleColumnCell(TableView.java:444)
at javax.swing.text.html.TableView.calculateColumnRequirements(TableView.java:407)
at javax.swing.text.html.TableView.calculateMinorAxisRequirements(TableView.java:529)
at javax.swing.text.BoxView.checkRequests(BoxView.java:918)
at javax.swing.text.BoxView.getMinimumSpan(BoxView.java:551)
at javax.swing.text.BoxView.calculateMinorAxisRequirements(BoxView.java:886)
at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(BlockView.java:129)
at javax.swing.text.BoxView.checkRequests(BoxView.java:918)
at javax.swing.text.BoxView.getMinimumSpan(BoxView.java:551)
at javax.swing.text.html.BlockView.getMinimumSpan(BlockView.java:361)
at javax.swing.text.BoxView.calculateMinorAxisRequirements(BoxView.java:886)
at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(BlockView.java:129)
at javax.swing.text.BoxView.checkRequests(BoxView.java:918)
at javax.swing.text.BoxView.setSpanOnAxis(BoxView.java:326)
at javax.swing.text.BoxView.layout(BoxView.java:691)
at javax.swing.text.BoxView.setSize(BoxView.java:380)
at javax.swing.plaf.basic.BasicTextUI$RootView.setSize(BasicTextUI.java:1702)
at javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:900)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1642)
at javax.swing.JEditorPane.getPreferredSize(JEditorPane.java:1412)
at gui.ava.html.image.generator.HtmlImageGenerator.getBufferedImage(HtmlImageGenerator.java:150)
at gui.ava.html.image.generator.HtmlImageGenerator.saveAsImage(HtmlImageGenerator.java:133)
at gui.ava.html.image.generator.HtmlImageGenerator.saveAsImage(HtmlImageGenerator.java:128)
at com.atcc.auto.mcms.process.parse.chain.ImageHandler.imgHandle(ImageHandler.java:170)
at com.atcc.auto.mcms.process.parse.chain.ImageHandler.handle(ImageHandler.java:91)
at com.atcc.auto.mcms.process.parse.chain.ContentHandler.nextStepHandle(ContentHandler.java:125)
at com.atcc.auto.mcms.process.parse.chain.ContentHandler.handle(ContentHandler.java:109)
at com.atcc.auto.mcms.core.service.impl.HandelManagerImpl$2.run(HandelManagerImpl.java:94)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)
"pool-2-thread-1" prio=10 tid=0x0000 nid=0x4474 in Object.wait() [0x00007fe88cbd9000]
&& java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.awt.MediaTracker.waitForID(MediaTracker.java:651)
- locked &0xf81a0& (a java.awt.MediaTracker)
at javax.swing.ImageIcon.loadImage(ImageIcon.java:278)
- locked &0xf81a0& (a java.awt.MediaTracker)
at javax.swing.ImageIcon.setImage(ImageIcon.java:344)
at javax.swing.text.html.ImageView.loadImage(ImageView.java:679)
at javax.swing.text.html.ImageView.refreshImage(ImageView.java:648)
at javax.swing.text.html.ImageView.sync(ImageView.java:620)
at javax.swing.text.html.ImageView.getPreferredSpan(ImageView.java:418)
at javax.swing.text.FlowView$LogicalView.getPreferredSpan(FlowView.java:715)
at javax.swing.text.FlowView.calculateMinorAxisRequirements(FlowView.java:216)
at javax.swing.text.html.ParagraphView.calculateMinorAxisRequirements(ParagraphView.java:128)
at javax.swing.text.BoxView.checkRequests(BoxView.java:918)
at javax.swing.text.BoxView.getMinimumSpan(BoxView.java:551)
at javax.swing.text.html.ParagraphView.getMinimumSpan(ParagraphView.java:261)
at javax.swing.text.BoxView.calculateMinorAxisRequirements(BoxView.java:886)
at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(BlockView.java:129)
at javax.swing.text.html.TableView$CellView.calculateMinorAxisRequirements(TableView.java:1769)
at javax.swing.text.BoxView.checkRequests(BoxView.java:918)
at javax.swing.text.BoxView.getMinimumSpan(BoxView.java:551)
at javax.swing.text.html.BlockView.getMinimumSpan(BlockView.java:361)
at javax.swing.text.html.TableView.checkSingleColumnCell(TableView.java:444)
at javax.swing.text.html.TableView.calculateColumnRequirements(TableView.java:407)
at javax.swing.text.html.TableView.calculateMinorAxisRequirements(TableView.java:529)
at javax.swing.text.BoxView.checkRequests(BoxView.java:918)
at javax.swing.text.BoxView.getMinimumSpan(BoxView.java:551)
at javax.swing.text.BoxView.calculateMinorAxisRequirements(BoxView.java:886)
at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(BlockView.java:129)
at javax.swing.text.BoxView.checkRequests(BoxView.java:918)
at javax.swing.text.BoxView.getMinimumSpan(BoxView.java:551)
at javax.swing.text.html.BlockView.getMinimumSpan(BlockView.java:361)
at javax.swing.text.BoxView.calculateMinorAxisRequirements(BoxView.java:886)
at javax.swing.text.html.BlockView.calculateMinorAxisRequirements(BlockView.java:129)
at javax.swing.text.BoxView.checkRequests(BoxView.java:918)
at javax.swing.text.BoxView.setSpanOnAxis(BoxView.java:326)
at javax.swing.text.BoxView.layout(BoxView.java:691)
at javax.swing.text.BoxView.setSize(BoxView.java:380)
at javax.swing.plaf.basic.BasicTextUI$RootView.setSize(BasicTextUI.java:1702)
at javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:900)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1642)
at javax.swing.JEditorPane.getPreferredSize(JEditorPane.java:1412)
at gui.ava.html.image.generator.HtmlImageGenerator.getBufferedImage(HtmlImageGenerator.java:150)
at gui.ava.html.image.generator.HtmlImageGenerator.saveAsImage(HtmlImageGenerator.java:133)
at gui.ava.html.image.generator.HtmlImageGenerator.saveAsImage(HtmlImageGenerator.java:128)
at com.atcc.auto.mcms.process.parse.chain.ImageHandler.imgHandle(ImageHandler.java:170)
at com.atcc.auto.mcms.process.parse.chain.ImageHandler.handle(ImageHandler.java:91)
at com.atcc.auto.mcms.process.parse.chain.ContentHandler.nextStepHandle(ContentHandler.java:125)
at com.atcc.auto.mcms.process.parse.chain.ContentHandler.handle(ContentHandler.java:109)
at com.atcc.auto.mcms.core.service.impl.HandelManagerImpl$2.run(HandelManagerImpl.java:94)
at java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy.rejectedExecution(ThreadPoolExecutor.java:1752)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:768)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:656)
at org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.execute(ThreadPoolTaskExecutor.java:242)
at com.atcc.auto.mcms.core.service.impl.HandelManagerImpl.handler(HandelManagerImpl.java:87)
at com.atcc.auto.mcms.scheduling.news.NewsPushJob.pushQueue(NewsPushJob.java:42)
at sun.reflect.GeneratedMethodAccessor107.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:64)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:53)
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:662)
问题补充:有人能帮忙看看么?
真是找不到答案 了
下载次数: 9
你可以观察一个线程跑的时候执行的时间,调整线程池大小,然后优化一下阻塞线程最长时间 试试 祝你好运
从这个日志里看所有的runnable的线程都是socket相关的,而且有两个被waiting to lock的锁0xe60000781efa278也都被runnable的线程locked住了。所以是不是可以分析下与服务器caucho交互的地方有没有阻塞发生。就这些发现了。
我在你的附件里找到这么一条信息:
resin-port-80-465" daemon prio=10 tid=0x0000 nid=0x22b0 runnable [0x00007fe8acd4a000]
&& java.lang.Thread.State: RUNNABLE
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
- locked &0xe63350& (a java.net.SocksSocketImpl)
同时,
"resin-port-80-26" daemon prio=10 tid=0x0f000 nid=0x4457 waiting for monitor entry [0x00007fe8aca47000]
&& java.lang.Thread.State: BLOCKED (on object monitor)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:406)
- waiting to lock &0xe63350& (a java.net.SocksSocketImpl)
at java.net.ServerSocket.implAccept(ServerSocket.java:462)
at java.net.ServerSocket.accept(ServerSocket.java:430)
at com.caucho.vfs.QServerSocketWrapper.accept(QServerSocketWrapper.java:105)
也就是说&0xe63350&被resin-port-80-465锁住了,为什么被锁住呢?因为resin-port-80-465一直处在socketAccept状态,也就是说你的远程响应出问题了。仔细排查下你的远程服务。
已解决问题
未解决问题}

我要回帖

更多关于 java jstack 分析工具 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信