Welche Leistungseinbußen bestehen bei der Verwendung eines SecurityManagers?

8

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.

    
Cedric Martin 22.11.2011, 17:10
quelle

3 Antworten

6

Es gibt eine Leistungseinbuße, aber es ist wahrscheinlich klein, weil:

  • Dies gilt nur, wenn Sie eine Aktivität versuchen, für die eine Berechtigungsprüfung erforderlich ist.
  • Die meisten Operationen, die Berechtigungsprüfungen erfordern, sind teure Operationen (E / A, Netzwerkzugriff usw.). Daher ist es wahrscheinlich, dass der Aufwand für Sicherheitsprüfungen nur einen geringen Prozentsatz der Gesamtlaufzeit ausmacht.
  • Der Scheck selbst kann sehr billig gemacht werden

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.

    
mikera 22.11.2011, 18:00
quelle
2

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.

    
jtahlborn 22.11.2011 17:36
quelle
1

Nach der Implementierung der Sicherheitsmanagerfrage habe ich einige empirische Beweise hier einzubringen:

A java SecurityManager, der bis auf eine einzige Prüfanpassung für System.exit identisch mit NO security manager ist

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%     
Alexandros 31.08.2017 09:07
quelle

Tags und Links