Адрес внепечной памяти JVM может быть изменен? - PullRequest
0 голосов
/ 31 августа 2018

У нас есть платформа, которая сильно зависит от памяти вне кучи в JVM. Мы заметили, что время от времени мы получаем SIGSEGV во время цикла GC: * ​​1001 *

V  [libjvm.so+0x5c56cf]  G1ParScanThreadState::copy_to_survivor_space(InCSetState, oopDesc*, markOopDesc*)+0x4bf

Я полностью понимаю, что их довольно сложно отследить, но мы начали сужать основной случай.

Вопрос:

Если я это сделаю:

base = unsafe.allocateMemory(capacity);

и, очевидно, сохранить base для последующего освобождения, может (каким-либо образом) GC вмешаться и выбрать, чтобы переместить мою родную память?

Я знаю, что GC не должен влиять на этот тип памяти, но я ищу какой-то авторитетный ответ на этот вопрос.

1 Ответ

0 голосов
/ 31 августа 2018

Это вернет некоторый указатель виртуального адреса, и AFAIK unsafe.allocateMemory просто вызовет malloc внутри. Будучи вне кучи памяти, очевидно, что GC не будет к ней прикасаться, и это было бы ужасно плохо и неожиданно, если позже вы сделаете Unsafe.freeMemory с этим указателем, только чтобы узнать, что он перемещен.

...