java程序卡住的原因_程序卡住了还是怎么了?

当Java程序卡住时,可能是因为某个操作如Compress或mq.send导致。本文通过分析.NET程序的线程状态,发现监听线程异常退出。解决方案是增加异常处理机制,确保线程在遇到异常时能正常运行。通过记录日志和异常重试,可以避免程序卡住的问题。
摘要由CSDN通过智能技术生成

程序卡住了还是怎么了?起因

客户说:“今天的预报又没有发出去,帮忙看下怎么回事?”

“...”

经过

登陆服务器,发现程序一直在打印

running

running

running

...

这是代码中写的

public static void Main(string[] args)

{

Console.Title = string.Format("Grib2压码程序 请勿关闭");

ActiveMq();

while (hasMessage)

{

Console.WriteLine("running");

Thread.Sleep(1000);

}

}

程序通过启动ActiveMQ,然后判断是否仍有消息在处理,如果在处理就Sleep当前线程,等待处理完毕

当接收到消息时的处理主逻辑:

public static void OnMessage(IMessage message)

{

var msg = message as ITextMessage;

if(msg != null)

{

hasMessage = true;

String date = msg.Text;

Compress(date);

mq.send(date);

hasMessage = false;

}

}

那么问题应该是Compress或者 mq.send 一直在处理,卡住了??

因为是.net程序,所以不能用jstack来分析线程了

通过windows自带的任务管理器,把程序dump出来

如何dump

然后使用windbg分析一下线程,直接通过文件, "open dump file",打开导出的dmp文件。

dump文件结果

windbg第一次使用,不是很懂得使用,但是注意到右下角threads的线程信息,发现只有一个主线程在运行!!

也就是说:我们的监听线程退出了!!!

那么,什么情况下会退出呢?

一般是线程运行过程中抛出异常没有处理

检查源代码,发现程序没有对出现异常做任何处理

所以,修改方案如下:

public static void OnMessage(IMessage message)

{

var msg = message as ITextMessage;

if(msg != null)

{

hasMessage = true;

String date = msg.Text;

if(Compress(date, 3))

{

mq.send(date);

}

else

{

mq.fail(date);

}

hasMessage = false;

}

}

public static bool Compress(string date, int retry)

{

if (retry == 0)

{

return false;

}

try

{

Compress(date);

return true;

}

catch (Exception ex)

{

Log.writeException(ex);

return Compress(date, retry - 1);

}

}

将监听消息部分的代码进行修改,增加重试,并进行try catch异常处理,出现异常时,在文件中记录日志

当然mq.send 也有可能出现异常,将send方法也进行try catch异常处理

替换程序,上线运行(这种问题看能否重现了,重现了就可以在error.log中找到了)

总结分析

windbg第一应用,表示很多信息都看不懂

主线程中需要考虑子线程的异常,有些线程,你以为在运行,实际上它退出了

其它

面试的时候,面试官问我

“你遇到过最难解决的问题,你是怎么解决的?”

“我特么都是问题解决了就忘记了,所以没啥印象”

不过,我是在心里说的

所以,对于别人问我的问题,我决定记录下来,免得将来忘记了

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[程序卡住了还是怎么了?]http://www.zyiz.net/tech/detail-127837.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值