Как заблокировать процесс Java в памяти? (MLOCK)
Я нашел этот вопрос переполнения стека из 2010: блокировка или закрепление Java-процесса в памяти
По сути, он говорит, что способ заблокировать Java-процесс в памяти с помощью JNI. Пример, на который он указывает, является неработающей ссылкой. Теперь, когда наступил 2013 год, у меня вопрос: есть ли лучший способ? И есть ли где-нибудь пример использования mlock в Java? Я крайне неопытен с JNI и с кодом C в целом, но довольно хорошо знаком с Java (хотя я НИКОГДА не использовал JNI).
Спасибо
2 ответа
Мне интересно, есть ли хорошее решение Java, которое не включает JNI, если это возможно.
Нет Закрепление приложения в памяти зависит от операционной системы и не поддерживается стандартными API JVM.
Закрепление довольно опасной вещи из-за возможного серьезного влияния на общую производительность системы. И, следовательно, он должен требовать привилегии root (или эквивалент) в любой системе, которая его поддерживает.
Я лично не пытался бы сделать это, и очень не хотел бы использовать приложение, которое сделало это. То, что вы пытаетесь достичь, (вероятно) лучше бы сделать другим способом...
Я хочу сделать это по соображениям безопасности.
Ой. Итак, что вы на самом деле пытаетесь сделать, чтобы остановить "сверхсекретные" вещи, записываемые в пространство подкачки / страницы на диске?
Я не уверен, что mlock помешает тому, чтобы что-то было записано для обмена.
Если кто-то может получить доступ к диску подкачки, есть вероятность, что он может использовать другие механизмы для извлечения данных; например, с помощью "/dev/mem" или аналога для чтения содержимого из физической памяти или виртуальной памяти процессов.
Обычный способ решения проблемы "сверхсекретных" вещей на диске подкачки - использовать массивы символов вместо строк для хранения материала и вручную перезаписывать их нулями, как только они будут выполнены.
Или исследуйте шифрование на уровне диска.
Я искал что-то подобное и нашел это:
https://github.com/LucidWorks/mlockall-agent/
Похоже, это действительно хорошее решение проблемы закрепления памяти Java. Если вы используете его, убедитесь, что ваш начальный размер кучи (-XMs) совпадает с вашим максимальным размером кучи (-Xmx) - в документации сказано, что если вы этого не сделаете, любая память, выделенная после начальной кучи не будет заблокирован