又是一个jmx问题
jmx明明端口占用了, 而且相关java进程也起来了, 为什么会不能通过jconsole访问jmx呢?总是:RMI non-JRMP server at remote endpoint
证书不对吗? 为什么通过的密码,那个机器的jms-ssl证书和我本机的大小不一样? 权限问题? 明明没错的? 拿我的证书拷贝过去, 结果, 还是一样。。。
jmx-client.xml、jmx-server.xml配置问题?修改后报密码不对—— 那说明了原来密码是没问题的! 白名单?—— 我擦,现在的jmx启动加入了白名单功能: 只允许名单内的机器去连接。 加上白名单,重启,还是一样。。。。
他又开始不停的说我“靠猜”了,。。
真TM郁闷。 远程调试吧, 代码对应不上了。方法跳来跳去, 而且又卡, 实在搞不懂啊。。 好像行号不对啊。整个更新本机代码, 刷新,重新远程调试 。。。 仍然不行,,, 下载远端代码,反编译,发现一样的啊, 那为什么不能代码对应上呢 ——— 之前都是好好的,,,,, —— 看日志,我想可能是这样吧。。。 ( 我没意思到,我已经在猜了, 虽然日志提供了一定的证据,但是并不是直接原因)
他又开始不停的说我“靠猜”了。。。
在他的指导下, 添加上源码,代码可以对应得上的调试了
———— 这个就明显不是password的问题了,如果password不对,提示不是这样的。
仔细仔细再看看。 还是明白, 代码跳来跳去,而且远程调试有很卡, 我十分郁闷。
最后还是他看到了原因。说是锁住了—— 我一听,好像是这么回事哦。—— 这代码里面到处是synchronized, 到处是filelock。 等等 , 还有很多的atomic的操作。。。 很多陌生api
我仔细看,可是没看到哪里有死锁啊,—— 他是怎么发现的? 通过jstat? jconsole? jvisualvm? jmap ? 哎
请教, 原来是死循环! 神奇的死循环!! 难怪之前调试有时候看到StackOverFlow呢! 难怪一个方法一直没反应过来呢,难怪他进去后就一直没出来了呢!难怪日志文件分秒不差的毫秒不差的不停打印日志呢!! 原来是死循环!!! 第一次在项目中碰到啊! 神奇了!
A类包含mapProceInfo等等
m1(processName) {
if(mapProceInfo.contains(processName)) {
复杂的process信息读取过程,并添加到mapProceInfo中。—————— 因为配置文件配错了,所以,mapProceInfo一直为空, 此处就显然死循环
读取过程中又刷新proceInfos, 刷新需要获取proceInfos,获取proceInfos调用的正是mapProceInfo!!!
}
return mapProceInfo.get(processName);
}
如图, 长时间的stepping 即表示了死!循!环!!!