Неверный доступ к памяти местоположения в 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
Также убедитесь, что вы строите графический интерфейс в потоке диспетчеризации событий и никогда не обновляете компонент графического интерфейса из какого-либо другого потока.
Связанные ошибки общеизвестно трудно воспроизвести, но изменение, связанное с изменением времени, наводит на размышления.