Запись / чтение памяти с использованием Unsafe в Java - PullRequest
1 голос
/ 06 октября 2011

Я знаю, что можно писать и читать напрямую в память, используя класс Unsafe в jvm.

Помимо того, что это действительно небезопасно и как-то контрпродуктивно, я вместо этого задавался вопросом, кто / что берет на себя ответственность запроверка границ разрешенной области памяти.А также, если есть какой-то механизм, который защищает уже выделенную память для перезаписи.В связи с этим последним вопросом, какой возможный ущерб можно нанести, переписав то, что не следует делать?Что ж, это лучше всего исправить следующим образом: какой тип памяти может быть записан, или какая информация там уже хранится?

Спасибо

Ответы [ 2 ]

2 голосов
/ 06 октября 2011

Используя класс Unsafe, вы берете на себя ответственность за проверку границ разрешенных областей памяти.

Вы не должны предполагать, что будет какой-то механизм, который предотвратит повреждение частей памяти вашего процесса, к которым вы не должны прикасаться.

Комментарий , сопровождающий Unsafe.getUnsafe(), довольно ясен:

[экземпляр Unsafe] можно использовать для чтения и записи данных в произвольные адреса памяти.

2 голосов
/ 06 октября 2011

Базовая операционная система гарантирует, что вы не будете писать вне памяти, выделенной вашему приложению (что она может легко сделать из-за Виртуальной памяти ).В противном случае вы получите ошибку сегментации или аналогичную ошибку. В дополнение к этому JVM может выполнить собственную проверку привязки.Вам определенно не разрешат писать в какую-либо разумную (т.е. другие приложения) память, и я сомневаюсь, что JVM позволит вам перезаписывать внутренние структуры, но я могу ошибаться.Итак, суммируем ответ на ваш вопрос: возможный ущерб от перезаписи, где вы не должны, в лучшем случае, если ваше приложение работает со сбоями, а в худшем - сбой JVM.было бы неплохо ... Кроме этого, вы, конечно, можете написать свой собственный распределитель памяти внутри памяти, выделенной Unsafe, и пометить некоторые области, чтобы код вашего приложения не записывал в области, которые он не должен.

Таким образом, ответ на ваш последний вопрос заключается в том, что если JVM позволяет вам обращаться к памяти за пределами выделенных небезопасных областей, то информация и тип памяти, к которой вы можете получить доступ, - это любые ваши объекты, а также любая внутренняя структура JVM.Очевидно, что изменение их приведет к хаосу, поэтому, вероятно, попытка сделать это приведет к краху.

...