Поставьте следующую ситуацию:
- У вас большая и сложная система (распределенный, одновременный, огромный набор данных), которая поддерживает множество пользователей.Код отправляется на данные.
- Вы хотите разрешить мобильный код в системе, то есть недоверенный код, который будет работать в тех же JVM, что и остальная часть системы, чтобы использовать преимущества локальности данных, избежать десериализации и т. Д.
Вы можете поместить код в забавный загрузчик классов и использовать настроенную политику безопасности, как это делает бегун апплета.Но все еще есть проблемы:
Система в целом должна быть защищена от вредоносного кода - например, порождает множество потоков, загружает весь процессор, выделяет слишком много памяти.
Идея спорав начале тысячелетия был JSR-121.Предполагалось, что изоляторы приносят большую часть преимуществ изоляции процессов - ограничения на использование процессора, порождение потоков, использование кучи: распределение ресурсов в целом.
Учитывая то, что Sun, казалось бы, отказалась от этих усилий, какое самое близкое из них мы можем получить в настоящее время?
Пока мои идеи таковы:
- Байт-код переводиткод для вставки отслеживания выделения.Google, похоже, сделал что-то похожее на это: http://code.google.com/p/java-allocation-instrumenter/.Нужно немного поработать, так как Google (Джошуа) загнал себя в угол и сделал всевозможные вещи закрытыми ...
- Также запретил звонки на вещи, которые менеджер безопасности не может, например, на Threadсоздание.
- Вставьте (редкие) проверки прерывания в циклы и рекурсивные функции, чтобы поток монитора мог наблюдать (используя ThreadMXBean), и, если это занимает слишком много времени, прерывать поток, нарушающий работу.Может быть проще просто установить ограничения на повторяемость - при любом вызове пользовательского кода базовый блок может быть введен только n раз перед прерыванием.
Существуют ли более эффективные или существующие способы сделать это?