Java中的websphere JIT错误
以下Java代码:
private void a(Object paramObject) throws IOException {
if ((paramObject instanceof Socket)) {
this.o = ((Socket)paramObject).getOutputStream();
this.i = ((Socket)paramObject).getInputStream();
} else {
this.o = new FileOutputStream(((RandomAccessFile)paramObject).getFD());
this.i = new BufferedInputStream(
new FileInputStream(((RandomAccessFile)paramObject).getFD()), 65536);
}
}
偶尔会产生以下异常,但仅当在WebSphere中的IBM Java VM中运行时:
java.lang.ClassCastException: java.net.Socket incompatible with java.io.RandomAccessFile
没有其他Java虚拟机存在此问题。我认为这一定是由于IBMJavaVM中的JIT错误造成的。参数只能是java.net.Socket
或java.io.RandomAccessFile
。对象是在同一类中创建的。这也不可能是ClassLoader
问题
我应该如何修改代码以避免此问题
# 1 楼答案
如果这确实是一个JIT错误(坦率地说,我在这里没有看到这个异常的任何其他原因),那么很难确切地告诉什么变化可能会阻止这一点
一个微小的改变(交换if块并否定检查)可能会有帮助,但同样可能的是,你在这里几乎什么都做不了
最安全的方法可能是完全禁用此方法的JIT编译。不幸的是,这样做的过程因JVM而异(在某些JVM上可能根本不受支持!)
# 2 楼答案
我同意Joachim Sauer的观点,代码看起来不错
您可以将代码重构为两个方法,一个用于
Socket
,另一个用于RandomAccessFile
。这可能会有所帮助,因为在内部,参数变量可能附带了类型信息你可以做的另一件事是: