2015-11-17 4 views
1

В последнее время у нас возникла ошибка переполнения объекта в производственной среде, например.Что такое перегруженный объект?

Caused by: java.lang.InternalError: pinned object overflow! 

Не могли бы вы объяснить

1) Что такое возлагали объект?

2) Поддерживает ли JVM внутренне или может ли это быть программно также?

3) Возможные случаи, когда может произойти переполнение объекта с закрепленным объектом?

+0

Вы говорите о JRockit? Пожалуйста, предоставьте сведения об окружающей среде. – Ivan

+0

с использованием weblogic, jdk 6. – user3198603

+0

Просьба предоставить полную трассировку стека. Вы пытались использовать JRockit Mission Control? – Ivan

ответ

1

ОК, предположим, что вы работаете с JRockit.

1) что такое закрепление объекта?

Закрепленный объект - это тот, который не допускается к перемещению. Как правило, объект может перемещаться с одного адреса на другой, если он продвигается или как часть уплотнения. Но если объект закреплен, GC не будет пытаться переместить его, пока он не будет закреплен. Это в основном означает, что у кого-то есть указатель на адрес памяти объекта, а JVM должен удерживать объект на месте.

2) Поддерживает ли JVM внутренне, или это может быть сделано программно?

Насколько я знаю, это можно сделать только программно. Например, следующий JNI-метод позволяет осуществлять прямой доступ к данным, хранящимся в JVM (*env)->GetPrimitiveArrayCritical().

Также JRockit имеет оптимизацию производительности - привязка буфера во время операции ввода-вывода, которая позволяет передать его адрес непосредственно в операционную систему. Эта оптимизация используется неявно путем вызова любого метода в *InputStream или *OutputStream (См. Подробности here).

3) Возможные случаи, когда закрепленный объект может произойти?

Существует много случаев - проблемы с вызовом JNI, неправильная обработка исключений в вызовах ввода/вывода. Чтобы быть более точным, мы должны иметь кучу дампов или результаты профилирования (JRockit Mission Control). Первое, на что мы должны обратить внимание, это количество стеков, заблокированных в I/O или количестве *InputStream экземпляров.

+0

Какой параметр следует искать в дампе памяти? Если jrockit делает это внутренне, вызывая любой метод на 'InputStream или OutputStream', как программист может его избежать? – user3198603

+0

Программист не может этого избежать. Проверьте, сколько потоков заблокировано в I/O и попытайтесь найти байт-массивы или * Объединить экземпляры на вашем дампе. Также укажите stacktrace вашего исключения. – Ivan

Смежные вопросы