jstack:将Process Explorer中看到的进程ID做16进制转换,到ThreadDump中加上0x 前缀即能找到对应线程(转)

原文链接:http://www.iteye.com/topic/1133941

症状:

使用Eclipse win 64位版本,indigo及kepler都重现了,使用tomcat 6.0.39,jdk1.6.u45及1.7u45均尝试了,也重现。

重现步骤很简单,使用debug模式启动时较容易出来,debug启动tomcat,(我的是webapp)然后在页面上随便点点即发现eclipse僵死,且任何从浏览器发出的请求都卡住不能被接收执行。

1、然后从任务管理器直接杀掉eclipse对应的javaw进程(有些可能是eclipse进程,根据指定的vm而定--eclipse.ini中 -vm指定)后,tomcat恢复正常,一切都正常了。

2、等待很久,真的很久,它自己又正常了,但过一会,又是这样。如果没事且有耐心的话,再等很久又会正常的?

 

排查步骤:

1、怀疑是eclipse或tomcat内存问题,于是乎jstat gc 查看发现一切正常。

2、从任务管理器查看tomcat 对应的java进程资源占用正常。

3、从任务管理器查看eclipse对应java进程,cpu占用 25%且持续很长时间。因为我是4核,所以实际已经占满了一个CPU资源了,这说明eclipse遇到了麻烦的问题。

4、使用Process Explorer 工具查看这个java进程中线程情况,发现有1个线程几乎占用了 这个进程绝大部分CPU资源(有时可能是两个线程),这个线程几乎是死循环了。

5、使用jstack连续对eclipse对应的java进程做threaddump,然后将Process Explorer中看到的进程ID做16进制转换,到ThreadDump中加上0x 前缀即能找到对应线程。通过这里,也就基本定位到问题的出处了。例如我的 TID:1372,转为16进制是55C,加上0x前缀则是 0x55c。

 

Html代码

  1. "Worker-10" prio=6 tid=0x0000000008d30800 nid=0x55c runnable [0x000000000d3cf000]  
  2.    java.lang.Thread.State: RUNNABLE  
  3.     at java.util.regex.Pattern$CharProperty.match(Pattern.java:3345)  
  4.     at java.util.regex.Pattern$Curly.match0(Pattern.java:3770)  
  5.     at java.util.regex.Pattern$Curly.match(Pattern.java:3744)  
  6.     at java.util.regex.Pattern$Start.match(Pattern.java:3055)  
  7.     at java.util.regex.Matcher.search(Matcher.java:1105)  
  8.     at java.util.regex.Matcher.find(Matcher.java:561)  
  9.     at org.eclipse.ui.internal.console.ConsolePatternMatcher$MatchJob.run(ConsolePatternMatcher.java:130)  
  10.     at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53) 
"Worker-10" prio=6 tid=0x0000000008d30800 nid=0x55c runnable [0x000000000d3cf000]
   java.lang.Thread.State: RUNNABLE
	at java.util.regex.Pattern$CharProperty.match(Pattern.java:3345)
	at java.util.regex.Pattern$Curly.match0(Pattern.java:3770)
	at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
	at java.util.regex.Pattern$Start.match(Pattern.java:3055)
	at java.util.regex.Matcher.search(Matcher.java:1105)
	at java.util.regex.Matcher.find(Matcher.java:561)
	at org.eclipse.ui.internal.console.ConsolePatternMatcher$MatchJob.run(ConsolePatternMatcher.java:130)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:53)

 

 

而且通过数次重现,均是

Html代码

  1. at org.eclipse.ui.internal.console.ConsolePatternMatcher$MatchJob.run(ConsolePatternMatcher.java:130) 
at org.eclipse.ui.internal.console.ConsolePatternMatcher$MatchJob.run(ConsolePatternMatcher.java:130)

 

这个从名称就能看出与console有关了。eclipse官方也报过类似bug,是在07年和11年报的,理论上早修复了。

 

6、差不多已经定位了,于是就从console下手了。

    观察console,发现我们的框架竟然把所有给浏览器的请求和响应都输出了,因为有个请求将会返回 200K左右的数据,相当于在Console中一次直接输出了200K的日志而且是没换行的,所以一开始我也没注意到。

    回过头看我Console配置,最大字符数是80000≈78K,我一条日志就远超出Console默认的展示量了。

 

7、接下来就开始解决问题

   7.1)将Console字符限制取消,即无限制。这个日志多且程序要在Eclipse中跑很久不现实,但我这么设置后实际就正常了,没有再出现eclipse僵死的情况。然后我手贱的点了下Console窗口上的“Clear Console”操作,Eclipse又僵死了。

  7.2)因为实际那个日志输出对我开发意义不大,是INFO级别的,有点类似访问日志。于是乎将其对应的LOG Append级别设置为WARN,不输出这个日志了,一切就回归正常了。

http://www.cnblogs.com/lnlvinso/p/3682681.html

 

时间: 2025-01-20 23:30:49

jstack:将Process Explorer中看到的进程ID做16进制转换,到ThreadDump中加上0x 前缀即能找到对应线程(转)的相关文章

[HOWTO]ORACLE中如何实现ASC字符串和16进制串互相转换

oracle|转换|字符串 ORACLE中如何实现ASC字符串和16进制串互相转换 欢迎大家同我交流:enhydraboy   enhydra_boy@tom.com 欢迎转载,请保留本声明,谢谢! 下面是笔者以前回答csdn论坛上问题的总结,希望对大家有用. ASC字符串==>16进制串 create or replace function AscToHex(sIn IN varchar2)RETURN varchar2ISsTmp varchar2(4000);i integer;BEGIN

vbscript语句中“&H”专用于16进制数表示_vbs

原来在vbscript语句中"&H"专用于16进制数表示的.在使用"&"这个符号用于字串连接时,应该在两侧加上一个空格,虽然不加空格在多数情况下运行是正常的,但那是不正确的或不规范的写法.在出现以字母"h"开头的字段时,如有这样的语句: sql = "insert into Student(xxx,xxx) values('"&htitle&"','"&hname&a

C# 中关于汉字与16进制转换的代码

/// <summary>    /// 从汉字转换到16进制    /// </summary>    /// <param name="s"></param>    /// <returns></returns>    public static string GetHexFromChs(string s)    {        if ((s.Length % 2) != 0)        {       

浅议Oracle中的进制转换

oracle|转换 作者: Eygle 出处: BLOG 进制转换是开发中经常需要用到的,本文简单介绍几种常用的进制转化方法. 一 16进制转换为10进制 可以通过to_number函数实现 SQL> select to_number('19f','xxx') from dual; TO_NUMBER('19F','XXX') ---------------------- 415 SQL> select to_number('f','xx') from dual; TO_NUMBER('F',

关于PHP中字符串与多进制转换函数的实例代码_php实例

转换函数 /** * [字符串转换为(2,8,16进制)ASCII码] * @param string $str [待处理字符串] * @param boolean $encode [字符串转换为ASCII|ASCII转换为字符串] * @param string $intType [2,8,16进制标示] * @return string byte_str [处理结果] * @author alexander */ function strtoascii($str, $encode=true,

[20121207]vim中使用bc做10与16进制计算.txt

[20121207]vim中使用bc做10与16进制计算.txt 工作中需要经常做10与16进制的转换,我记得以前有一个插件与vim结合可以实现简单的计算功能,比在平时输入是时输入ctrl+r=计算式(在插入模式)要方便一些,我个人计算时经常使用.链接如下: http://www.vim.org/scripts/script.php?script_id=219http://space.itpub.net/267265/viewspace-82924 实际上作者给出的例子,好像也可以实现,我感觉不

android中String转换成16进制的方法

问题描述 android中String转换成16进制的方法 想请教一下?把一个24个字节的字符串转换成16进制,并把结果打印出来要怎么写,网上有一些方法但是没有说转换完的16进制串打印出来要用哪个参数?求指点 解决方案 byte[] b = ""字符串"".getBytes();foreach (byte i : b){if (i < 16) System.out.print(""0"" + Integer.toHexS

JavaScript中的16进制字符(改进)_javascript技巧

原始的代码: 复制代码 代码如下: //将文字转换为16进制 function textToSix(str) { return escape(str).replace(/%/g, function () { return "\\"; }).toLowerCase(); } 改进后的: 复制代码 代码如下: //将文字转换为16进制 function textToHex(str) { //escape对0-255以外的unicode值进行编码时输出%u****格式,例如:%u6267%u

c++中 int十进制数如何转int 16进制数

问题描述 c++中 int十进制数如何转int 16进制数 例如,我有int a = 100:但是我要获得int b = 0x100:如何把a转换成b. 解决方案 你这个只能是转成16进制字符串,如果是数值的话,你可以直接这样写,在内存中,不管什么进制,都是以二进制表示 解决方案二: int转6位16进制数. 解决方案三: 不妨看看 char *itoa( int value, char *string,int radix); 第三个参数是进制 解决方案四: 可以先转换成字符串,然后通过字符串再