Как заблокировать процесс Java в памяти? (MLOCK)

Я нашел этот вопрос переполнения стека из 2010: блокировка или закрепление Java-процесса в памяти

По сути, он говорит, что способ заблокировать Java-процесс в памяти с помощью JNI. Пример, на который он указывает, является неработающей ссылкой. Теперь, когда наступил 2013 год, у меня вопрос: есть ли лучший способ? И есть ли где-нибудь пример использования mlock в Java? Я крайне неопытен с JNI и с кодом C в целом, но довольно хорошо знаком с Java (хотя я НИКОГДА не использовал JNI).

Спасибо

2 ответа

Мне интересно, есть ли хорошее решение Java, которое не включает JNI, если это возможно.

Нет Закрепление приложения в памяти зависит от операционной системы и не поддерживается стандартными API JVM.


Закрепление довольно опасной вещи из-за возможного серьезного влияния на общую производительность системы. И, следовательно, он должен требовать привилегии root (или эквивалент) в любой системе, которая его поддерживает.

Я лично не пытался бы сделать это, и очень не хотел бы использовать приложение, которое сделало это. То, что вы пытаетесь достичь, (вероятно) лучше бы сделать другим способом...


Я хочу сделать это по соображениям безопасности.

Ой. Итак, что вы на самом деле пытаетесь сделать, чтобы остановить "сверхсекретные" вещи, записываемые в пространство подкачки / страницы на диске?

  1. Я не уверен, что mlock помешает тому, чтобы что-то было записано для обмена.

  2. Если кто-то может получить доступ к диску подкачки, есть вероятность, что он может использовать другие механизмы для извлечения данных; например, с помощью "/dev/mem" или аналога для чтения содержимого из физической памяти или виртуальной памяти процессов.

  3. Обычный способ решения проблемы "сверхсекретных" вещей на диске подкачки - использовать массивы символов вместо строк для хранения материала и вручную перезаписывать их нулями, как только они будут выполнены.

  4. Или исследуйте шифрование на уровне диска.

Я искал что-то подобное и нашел это:

https://github.com/LucidWorks/mlockall-agent/

Похоже, это действительно хорошее решение проблемы закрепления памяти Java. Если вы используете его, убедитесь, что ваш начальный размер кучи (-XMs) совпадает с вашим максимальным размером кучи (-Xmx) - в документации сказано, что если вы этого не сделаете, любая память, выделенная после начальной кучи не будет заблокирован

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