ОК, предположим, что вы работаете с JRockit.
1) что такое закрепление объекта?
Закрепленный объект - это тот, который не допускается к перемещению. Как правило, объект может перемещаться с одного адреса на другой, если он продвигается или как часть уплотнения. Но если объект закреплен, GC не будет пытаться переместить его, пока он не будет закреплен. Это в основном означает, что у кого-то есть указатель на адрес памяти объекта, а JVM должен удерживать объект на месте.
2) Поддерживает ли JVM внутренне, или это может быть сделано программно?
Насколько я знаю, это можно сделать только программно. Например, следующий JNI-метод позволяет осуществлять прямой доступ к данным, хранящимся в JVM (*env)->GetPrimitiveArrayCritical()
.
Также JRockit имеет оптимизацию производительности - привязка буфера во время операции ввода-вывода, которая позволяет передать его адрес непосредственно в операционную систему. Эта оптимизация используется неявно путем вызова любого метода в *InputStream
или *OutputStream
(См. Подробности here).
3) Возможные случаи, когда закрепленный объект может произойти?
Существует много случаев - проблемы с вызовом JNI, неправильная обработка исключений в вызовах ввода/вывода. Чтобы быть более точным, мы должны иметь кучу дампов или результаты профилирования (JRockit Mission Control). Первое, на что мы должны обратить внимание, это количество стеков, заблокированных в I/O или количестве *InputStream
экземпляров.
Вы говорите о JRockit? Пожалуйста, предоставьте сведения об окружающей среде. – Ivan
с использованием weblogic, jdk 6. – user3198603
Просьба предоставить полную трассировку стека. Вы пытались использовать JRockit Mission Control? – Ivan