Posit la situation suivante:Quel est le plus proche des isolats vrais (limités en ressources) dans la JVM aujourd'hui?
- Vous avez un système vaste et complexe (distribué, ensemble de données en même temps, énorme) qui supporte de nombreux utilisateurs. Le code est envoyé aux données.
- Vous souhaitez autoriser le code mobile dans le système - à savoir le code non sécurisé qui se déroulera dans les mêmes JVMs que le reste du système, pour tirer profit de la localité des données, éviter désérialisation etc.
Vous pouvez placer le code dans un classloader amusant et utiliser une stratégie de sécurité personnalisée comme le fait l'applet runner. Mais il y a encore des problèmes:
Le système dans son ensemble devrait être protégé contre les codes malveillants - par exemple, engendrer des charges de threads, manger tout le CPU, allouer trop de mémoire.
L'idée évoquée au début du millénaire était JSR-121. Les isolats étaient censés apporter la plupart des avantages de l'isolation des processus - limites sur l'utilisation de l'unité centrale, la multiplication des threads, l'utilisation du tas: allocation de ressources en général. Etant donné que cet effort a apparemment été abandonné par Sun, quel est le plus proche que nous pouvons obtenir actuellement?
Jusqu'à présent, mes idées sont:
- bytecode traduire le code à insérer le suivi de l'allocation. Google semble avoir fait quelque chose de similaire à ceci: http://code.google.com/p/java-allocation-instrumenter/. Il faut un peu de travail car Google s'est bloqué dans un coin et a fait toutes sortes de choses privées ...
- Interdire aussi les appels à des choses que le gestionnaire de sécurité ne peut pas, par exemple la création de threads.
- Insérez des vérifications d'interruption (rares) dans des boucles et des fonctions récursives pour qu'un thread de surveillance puisse les regarder (en utilisant ThreadMXBean), et si cela prend trop de temps, interrompez le thread incriminé. Il serait peut-être plus simple de limiter la réentrance - dans tout appel au code utilisateur, un bloc de base ne peut être saisi que n fois avant d'être abandonné.
Y a-t-il des façons meilleures ou existantes de le faire?
La meilleure façon que je pouvais penser de droite est de jeter chaque utilisateur dans sa propre JVM qui a un faible XMX, et est limitée par le système d'exploitation pour le CPU. Très inefficace au fur et à mesure que le nombre d'utilisateurs augmente, mais l'idée de coder quelque chose comme ça me dépasse. – bwawok
Une chance jusqu'à présent? Voulez-vous mettre à jour? Merci. J'ai cherché cela aussi, c'est à quel point j'ai eu http://stackoverflow.com/questions/3887130/java-implementation-of-a-jvm – mschonaker