Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hessian序列化导致高cpu使用率_Java_Serialization_Hessian - Fatal编程技术网

Java Hessian序列化导致高cpu使用率

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

我发现在线环境中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
    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;
    }
  }