Произвольное поведение JVM - PullRequest
1 голос
/ 05 июля 2010

Представьте себе установку из 6-7 серверов, все одинаковые с одинаковыми Java-версия "1.6.0_18" Среда выполнения OpenJDK (IcedTea6 1.8) (fedora-36.b18.fc11-i386) OpenJDK Server VM (сборка 14.0-b16, смешанный режим)

каждая из которых запускает программу (интенсивно использует память и процессор) в течение нескольких часов, даже дней, успешно завершая много раз (получение статистических данных такого рода), , но на 1 машине , независимо от параметров или способа выполнил (javac -source 1.5 * .java / javac -O -source 1.5, javac **, представьте любую комбинацию самостоятельно:))
или запустил его (-Xms200000k или просто java blabla.java, вы поняли)

Я в итоге получаю, а не в конкретный момент или итерацию "java.lang.ArrayIndexOutOfBoundsException: -1341472392"?! Во-первых, программа никогда не будет работать с таким большим значением, не говоря уже о негативном. (строка кода содержит вызов ArrayList с целыми числами) (это число меняется каждый раз, как я заметил)

Обратите внимание, что я могу «возобновить» сбойный тест, и я могу на этом компьютере, он делает еще несколько тестов, снова дает сбой.

Ничего страшного, я не владею коробками и все остальные работают, но это довольно странно для меня.

Из личного интереса, как это происходит с не очень радужным OpenJDK?

Ответы [ 2 ]

3 голосов
/ 05 июля 2010

Звучит странно. Является ли переменная, используемая для индексации массива, длинной или на нее когда-либо влияет длинная переменная? В этом случае доступ к переменной не гарантируется как атомарный:

С http://java.sun.com/docs/books/jls/second_edition/html/memory.doc.html#28733

Если переменная типа double или long не объявлена ​​как volatile, то для действий загрузки, сохранения, чтения и записи они обрабатываются так, как если бы они были двумя переменными по 32 бита каждая: где правила требуют одного из этих действий выполняется два таких действия, по одному для каждой 32-битной половины. Способ, которым 64 бита двойной или длинной переменной кодируются в две 32-битные величины, зависит от реализации. Действия загрузки, сохранения, чтения и записи для энергозависимых переменных являются атомарными, даже если тип переменной - double или long.

Вы можете попытаться объявить переменную индекса как volatile или использовать другие средства синхронизации (например, с помощью AtomicLong или чего-то подобного), если вы подозреваете, что это может быть проблемой.

0 голосов
/ 05 июля 2010

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

...