有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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.Socketjava.io.RandomAccessFile。对象是在同一类中创建的。这也不可能是ClassLoader问题

我应该如何修改代码以避免此问题


共 (2) 个答案

  1. # 1 楼答案

    如果这确实是一个JIT错误(坦率地说,我在这里没有看到这个异常的任何其他原因),那么很难确切地告诉什么变化可能会阻止这一点

    一个微小的改变(交换if块并否定检查)可能会有帮助,但同样可能的是,你在这里几乎什么都做不了

    最安全的方法可能是完全禁用此方法的JIT编译。不幸的是,这样做的过程因JVM而异(在某些JVM上可能根本不受支持!)

  2. # 2 楼答案

    我同意Joachim Sauer的观点,代码看起来不错

    您可以将代码重构为两个方法,一个用于Socket,另一个用于RandomAccessFile。这可能会有所帮助,因为在内部,参数变量可能附带了类型信息

    你可以做的另一件事是:

    if (paramObject instanceof Socket) {
      handleSocket((Socket) paramObject);
    } else if (paramObject instanceof RandomAccessFile) {
      handleRandomAccessFile((RandomAccessFile) paramObject);
    } else {
      throw new IllegalStateException(paramObject.getClass() + paramObject.getClass().getClassLoader());
      // plus more information that you might need.
    }