Java Hessian序列化导致高cpu使用率
我发现在线环境中CPU的使用率很高,接近2000%,系统负载也很高。以下是jstack输出(仅发布一个线程): 同时在tomcat日志中发布异常:Java Hessian序列化导致高cpu使用率,java,serialization,hessian,Java,Serialization,Hessian,我发现在线环境中CPU的使用率很高,接近2000%,系统负载也很高。以下是jstack输出(仅发布一个线程): 同时在tomcat日志中发布异常: Aug 21, 2016 4:32:56 AM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet products_api threw exception java.lang.StackOverflowError
Aug 21, 2016 4:32:56 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet products_api threw exception
java.lang.StackOverflowError
at com.caucho.hessian.util.IdentityIntMap.get(IdentityIntMap.java:114)
at com.caucho.hessian.io.Hessian2Output.addRef(Hessian2Output.java:1314)
at com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:141)
at com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:490)
at com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:153)
at com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:490)
at com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:153)
at com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:490)
at com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:153)
at com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:490)
at com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:153)
at com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:490)
at com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:153)
我想知道是否有任何特殊的Java对象类型(数据或时间?)使hessian进入无限循环,以前有人遇到过这样的问题吗?非常感谢
我使用的是Oracle JDK 7和Hession 3.1.5。
这是IdentityIntMap#get(对象键)中的代码
快速浏览一下堆栈跟踪和3.1.5版的相关文件,这似乎是这个“Hessian”库中的一个bug:
Hessian2Output#writeObject
方法和JavaSerializer#writeObject
方法正在交替调用,没有停止条件。如果没有兼容性问题,我建议尝试一个更新版本的库,并希望该错误在那里得到修复。它解决了新版本的问题吗?快速浏览堆栈跟踪和版本3.1.5的相关文件,这似乎是这个“Hessian”中的一个错误库:Hessian2Output#writeObject
方法和JavaSerializer#writeObject
方法交替调用,没有停止条件。如果没有兼容性问题,我建议尝试一个新版本的库,并希望该错误在那里得到修复。它解决了新版本的问题吗?
Aug 21, 2016 4:32:56 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet products_api threw exception
java.lang.StackOverflowError
at com.caucho.hessian.util.IdentityIntMap.get(IdentityIntMap.java:114)
at com.caucho.hessian.io.Hessian2Output.addRef(Hessian2Output.java:1314)
at com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:141)
at com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:490)
at com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:153)
at com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:490)
at com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:153)
at com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:490)
at com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:153)
at com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:490)
at com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:153)
at com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:490)
at com.caucho.hessian.io.JavaSerializer.writeObject(JavaSerializer.java:153)
public int get(Object key)
{
int mask = _mask;
int hash = System.identityHashCode(key) % mask & mask;
Object []keys = _keys;
while (true) {
Object mapKey = keys[hash];
if (mapKey == null)
return NULL;
else if (mapKey == key)
return _values[hash];
hash = (hash + 1) % mask;
}
}