Gibt es bei Verwendung eines SecurityManagers eine Leistungseinbuße?
Ich brauche Folgendes:
%Vor%Hat das einen großen Einfluss auf mein Programm?
Das Programm öffnet zum Beispiel viele Dateien. Und wenn ich den SecurityManager aktiviere und mich dort einlogge, kann ich sagen, dass diese Methoden oft aufgerufen werden. Wirklich viel. So viel, dass die normale Protokollierung bei der Protokollierung von diesen beiden Methoden verloren geht. Es scheint also, dass das Setzen eines SecurityManagers bedeutet, dass viele und viele Anrufe getätigt werden. Wäre es langsamer als der Standard-SecurityManager? (Gibt es standardmäßig irgendwelche?)
Wie funktioniert das? Welcher Teil des Programms wird wie oft auf Berechtigungen überprüft? Ich bin besorgt über die zwei checkPermission (...) Methoden.
Es gibt eine Leistungseinbuße, aber es ist wahrscheinlich klein, weil:
Beachten Sie insbesondere, dass der aufrufende Code für Sicherheitschecks im Java-Bibliothekscode normalerweise sehr leicht ist, also etwa so:
%Vor%Wenn Ihr Sicherheitsmanagercode selbst leicht ist, sollten die Laufzeitkosten für die Sicherheitsprüfung vernachlässigbar sein. Ich würde vermeiden das Einfügen eines Logging-Codes in den SecurityManager selbst aber - das wäre teuer und gehört wahrscheinlich zu einer höheren Ebene in Ihrem Anwendungscode.
Wenn Sie den Aufwand des Sicherheits-Managers für Berechtigungen, die Sie nicht interessieren, absolut minimieren möchten, sollten Sie die spezifischen checkXXX-Methoden überschreiben, die Sie nicht benötigen:
%Vor%Letztendlich müssen Sie einen Benchmark für Ihre spezielle Situation erstellen, aber die "Bauchgefühl" -Antwort wäre, dass Sie sich nicht wirklich darum kümmern sollten.
Ja, es gibt eine Leistungseinbuße. Wenn Sie darüber besorgt sind, ist Ihr einziger Weg, es zu messen und zu sehen, ob die Strafe zu hoch ist.
Eine mögliche Lösung für Ihren spezifischen Anwendungsfall ist, wenn Sie den Umfang des Bedarfs eingrenzen können. Sie möchten natürlich einen Code, den Sie nicht kontrollieren, durch Beenden der Anwendung stoppen. Wenn Sie wissen, wann dieser Code aufgerufen werden kann, können Sie den Sicherheitsmanager während dieses Aufrufs festlegen (beachten Sie, dass Sie hier Threading-Auswirkungen beachten müssen, da die Einstellung des Sicherheitsmanagers global ist), z :
%Vor%UPDATE:
Um zu klären, wer zu dieser Antwort später kommen könnte, ist diese Antwort nicht für den Umgang mit potentiell bösartigem Code gedacht. In diesem Fall sollte ein entsprechend konfigurierter SecurityManager immer vorhanden sein . Diese Antwort geht davon aus, dass das OP versucht, mit einer schlecht geschriebenen Bibliothek von Drittanbietern umzugehen, die unglücklicherweise zu einem genau definierten Zeitpunkt auf System.exit () zugreift.
Nach der Implementierung der Sicherheitsmanagerfrage habe ich einige empirische Beweise hier einzubringen:
Der Leistungseinfluss mit dieser anonymen inneren Klasse war RIESIG:
%Vor%Meine Erfahrung nach dem Start meiner Anwendung in Eclipse war, dass es sichtbar langsamer war, und ich bestätigte dasselbe im PC eines Kollegen.
Ich denke also, dass "vernachlässigbar" eine Untertreibung sein kann (und mein Anwendungsfall führt gar nicht einmal Kontrollen durch!). Betrachten Sie dies als eine Anekdote, dass dies nicht der Fall ist.
Als weitere Randnotiz: Ich habe eine letzte Klasse mit do-nothing-Prüfungen für ALLE Methoden erstellt, um zu verhindern, dass Berechtigungsobjekte und dergleichen instanziert werden (beende den JIT-Compiler dazu, ihn zu beschleunigen). Unter Verwendung dieses Ansatzes war der Leistungseinfluss tatsächlich minimal. Also, für Leute, die einfach nur ein paar spezifische Checks hinzufügen wollen (und sich nicht auf Java-Richtlinien verlassen), hat dies tatsächlich nur einen geringen Einfluss:
%Vor%Tags und Links java security securitymanager