Вы работаете на неправильном уровне абстракции.
Java (и, предположительно, .NET) относится к объектам, использующим дескрипторы, а не необработанные указатели. Базовая Java VM может перемещать объекты в виртуальной памяти в любое время; Java-приложение не видит никакой разницы.
Приложения Win32 и Linux (такие как Java VM) обращаются к памяти, используя виртуальные адреса. В микросхеме ОЗУ происходит сопоставление виртуального адреса с физическим адресом. Ядро может изменить это отображение в любое время (например, если данные переносятся на диск, а затем считываются в другую область памяти), и приложения не видят никакой разницы.
Так что, если вы используете Java и .NET, я бы не стал менять ваше приложение Java / .NET для достижения этой цели. Вместо этого я бы изменил ядро Linux или, возможно, Java VM.
Для прототипа одним из подходов может быть загрузка Linux с параметром mem =, чтобы ограничить использование памяти ядром меньшим, чем объем вашей памяти, а затем посмотреть, можете ли вы отобразить запасную память (возможно, путем отображения dev / mem как root?). Затем вы можете изменить все вызовы malloc () в виртуальной машине Java, чтобы использовать свой собственный специальный распределитель памяти, который выделяет из этого свободного пространства.
Для реальной реализации этого вы должны сделать это, изменив ядро и сохранив совместимость с пользовательским пространством. Посмотрите на работу, проделанную в оперативном подключении к памяти в Linux , например. http://lhms.sourceforge.net/