问题描述
下面给出的是 Groovy util 文件中的代码片段,并从不同的 groovy 文件中调用,该文件基本上是使用 java.lang.groovyObject.invokeMethod(methodName,paramvalues) 从 Java 类中调用的
运行时的参数值:x 和 y 的 0 和 4708。
在 WebSphere 中作为应用程序的一部分运行时,有几个挂起的线程问题正好在线上报告
inc +=base
,这是在while循环内。
错误和跟踪如下,
ThreadMonitor W WSVR0605W:线程“WebContainer : 2”(000001b0) 已经活动了 607463 毫秒并且可能被挂起。该服务器中总共有 1 个线程可能挂起。
在 xxx.xxxx.xxxxx.getIncrementValue(FileName:LinNumber) . . 在 Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java : 90) . . 在 groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034)
private static int getIncrementValue(int x,int y){
int base = 100;
int range = 0;
if(x < 0){
range = x;
range = y + Math.abs(range);
}else{
range = y;
}
int inc = (range) /6;
if((range / 10) == 0){
base = 1;
} else if ((range / 100 <= 10){
base = 10;
}
inc = roundToHundred(inc)
if((inc * 6) <= range) {
while((inc * 6) <= range){
inc += base;
}
}
return inc;
}
}
我真的不知道这里可能是什么问题。因为 while 循环只处理原始堆栈内存值。有人可以解释一下在这种情况下还有什么可能。
注意:此问题并非每次都会发生。一个月只发生两次或三次。
解决方法
WSVR0605W 不是错误,只是一个通知。如果一个线程长时间处于忙碌状态,它可能会被挂起,因此 WebSphere 为系统操作员的信息提供此通知。
触发通知的时间间隔是可配置的,见: