在JRockit VM上运行粗麻布时,是否有人遇到此异常?
Caused by: java.lang.ArrayIndexOutOfBoundsException: -418
at com.caucho.hessian.util.IdentityIntMap.put(IdentityIntMap.java:141)
at com.caucho.hessian.io.Hessian2Output.addRef(Hessian2Output.java:1285)
at com.caucho.hessian.io.UnsafeSerializer.writeObject(UnsafeSerializer.java:157)
at com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:421)
at com.caucho.hessian.io.CollectionSerializer.writeObject(CollectionSerializer.java:102)
at com.caucho.hessian.io.Hessian2Output.writeObject(Hessian2Output.java:421)
at com.caucho.hessian.io.UnsafeSerializer$ObjectFieldSerializer.serialize(UnsafeSerializer.java:293)
... 34 more
我花了一个多星期的时间对该问题进行故障排除,只是发现粗麻布可以与HotSpot VM正常工作,但始终无法使用JRockit VM序列化某些对象。我实际上想出了一个简单的修复程序,但是它需要修改IdentityIntMap.java代码并更新粗麻布的jar文件。
最佳答案
这是我想出的解决方法。我不知道如何将Hessian代码通知维护人员,因此我将其发布在这里。修改文件:
com.caucho.hessian.util.IdentityIntMap.java从第112行开始:
public final int get(Object key)
{
int prime = _prime;
// int hash = System.identityHashCode(key) % prime;
int hash = System.identityHashCode(key);
// JRockit VMs can return a negative number which will cause this method to throw an exception
if (hash < 0)
hash = -hash;
hash = hash % prime;
...
还要从第135行开始的下一个方法中更改代码:
public final int put(Object key, int value, boolean isReplace)
{
int prime = _prime;
// int hash = System.identityHashCode(key) % prime;
int hash = System.identityHashCode(key);
// JRockit VMs can return a negative number which will cause this method to throw an exception
if (hash < 0)
hash = -hash;
hash = hash % prime;
...