JIT ошибка в Java - PullRequest
       16

JIT ошибка в Java

4 голосов
/ 21 сентября 2011

Следующий код 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);
    }
}

время от времени выдает следующее исключение, но только при запуске в IBM Java VM в WebSphere:

java.lang.ClassCastException: java.net.Socket incompatible with java.io.RandomAccessFile

Ни одна другая Java VM не имеет этой проблемы. Я думаю, что это должно быть из-за ошибки JIT в IBM Java VM. Параметр может быть только java.net.Socket или java.io.RandomAccessFile. Объект создан в том же классе. Это также не может быть проблемой ClassLoader.

Как мне изменить мой код, чтобы избежать этой проблемы?

Ответы [ 2 ]

3 голосов
/ 21 сентября 2011

Если это действительно ошибка JIT (и, честно говоря, я не вижу другой причины для этого исключения в этом месте), то очень трудно точно сказать , что изменитьможет помешать этому.

A крошечное изменение (замена блоков if и отмена проверки) может помочь, но с тем же успехом может оказаться, что вы почти ничего не делаетеможете сделать здесь.

Ставка самая безопасная , вероятно, вообще запрещает JIT-компиляцию этого метода.К сожалению, этот процесс варьируется от JVM до JVM (и может вообще не поддерживаться некоторыми JVM!).

2 голосов
/ 21 сентября 2011

Я согласен с Йоахимом Зауэром в том, что код выглядит нормально.

Вы можете изменить код на два метода: один для 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.
}
...