Неверный доступ к памяти местоположения в Java

Я работаю над проектом Java в течение года. Мой код работал нормально в течение нескольких месяцев. Несколько дней назад я обновил Java SDK до последней версии 1.6.0_26 на своем Mac (Snow Leopard 10.6.8). После обновления происходит нечто очень странное. Когда я запускаю некоторые из классов, я получаю эту ошибку:

Недопустимый доступ к памяти местоположения 0x202 рип =0x202

Но если я запускаю их с -Xint (интерпретировано), они работают, медленно, но работают нормально. Я получаю эту проблему в классах, где я использую побитовые операторы (битборды для игры Othello). Я не могу поместить любой код здесь, потому что я не получаю ошибку, исключение или что-то подобное. Я просто получаю это раздражающее сообщение.

Это нормально, что код не работает без -Xint, но работает с ним? Что я должен делать?

заранее спасибо

4 ответа

Решение

Когда JVM начинает так зависать, это признак того, что что-то сломало модель выполнения JVM.

Есть ли в вашем приложении какой-либо нативный код? Используются ли сторонние библиотеки с компонентами собственного кода? Если ни то, ни другое не соответствует действительности, то есть вероятность, что это ошибка в порте Apple JVM. Это может быть ошибка компилятора JIT или ошибка в некоторой библиотеке собственного кода JVM.

Что вы можете сделать с такой ошибкой?

Не много.

  • Сократите свое приложение, постепенно отсеивая биты, пока у вас не появится небольшой тестовый сценарий, в котором обнаружена проблема.
  • На основе тестового примера посмотрите, есть ли какой-то эмпирический способ избежать проблемы.
  • Отправьте отчет об ошибке в Apple с тестовым набором.

Я только столкнулся с этой ситуацией, и оказалось, что она связана с фрагментом кода, который сериализует объект JSON с циклической ссылкой на самого себя. Я удалил цикл, и ошибка ушла. Я подозреваю, что это связано с ошибкой переполнения памяти, которая теперь по-разному обрабатывается новыми JVM в Mac OSX. В этом случае я работал под управлением Mac OSX 10.7.

Для полноты я получил следующие ошибки:

Invalid access of stack red zone 0x10e586d30 rip=0x10daabba6
Bus error: 10

А также:

Invalid memory access of location 0x10b655890 rip=0x10a8baba6
Segmentation fault: 11

Пожалуйста, проверьте, если /etc/hosts пуст и убедитесь, что он включает эти конфигурации:

127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost 
fe80::1%lo0     localhost

Также убедитесь, что вы строите графический интерфейс в потоке диспетчеризации событий и никогда не обновляете компонент графического интерфейса из какого-либо другого потока.

Связанные ошибки общеизвестно трудно воспроизвести, но изменение, связанное с изменением времени, наводит на размышления.

Другие вопросы по тегам