セキュリティマネージャーの質問を実装した後、ここで貢献するいくつかの経験的証拠があります。
System.exitの単一のチェック調整を除いてNOセキュリティマネージャーと同一のJavaSecurityManager
この匿名の内部クラスによるパフォーマンスへの影響は非常に大きかった。
System.setSecurityManager(new SecurityManager() {
@Override
public void checkPermission(Permission perm) {
return; // no security manager behaviour
}
@Override
public void checkPermission(Permission perm, Object context) {
return; // no security manager behaviour
}
@Override
public void checkExit(int status) {
Thread.dumpStack();
super.checkExit(status);
}
});
Eclipseでアプリケーションを起動した後の私の経験では、アプリケーションの速度が明らかに遅く、同僚のPCでも同じことを確認しました。
したがって、「無視できる」というのは控えめな表現かもしれないと思います(そして、私のユースケースは実際にはチェックを実行しません!)。これは、そうではないという逸話と考えてください。
別の補足として:パーミッションオブジェクトなどのインスタンス化を回避するために、ALLメソッドに対して何もしないチェックを使用して最終クラスを作成しました(最後に、jitコンパイラにホットワイヤーを使用するように促します)。このアプローチを使用すると、パフォーマンスへの影響は実際に最小限に抑えられました。したがって、単にいくつかの特定のチェックを追加したい(そしてJavaポリシーに依存しない)人にとって、これは実際には無視できるほどの影響しかありません。
public final class SystemExitTraceSecurityManager extends SecurityManager {
@Override
public final void checkAccept(String host, int port) {
}
@Override
public final void checkAccess(Thread t) {
}
@Override
public final void checkAccess(ThreadGroup g) {
}
@Override
public final void checkAwtEventQueueAccess() {
}
@Override
public final void checkConnect(String host, int port) {
}
@Override
public final void checkConnect(String host, int port, Object context) {
}
@Override
public final void checkCreateClassLoader() {
}
public final void checkDelete(String file) {
};
@Override
public final void checkExec(String cmd) {
}
public final void checkExit(int status) {
Thread.dumpStack();
};
@Override
public final void checkLink(String lib) {
}
@Override
public final void checkListen(int port) {
}
@Override
public final void checkMemberAccess(Class<?> clazz, int which) {
}
@Override
public final void checkMulticast(InetAddress maddr) {
}
@Override
public final void checkMulticast(InetAddress maddr, byte ttl) {
}
@Override
public final void checkPackageAccess(String pkg) {
}
@Override
public final void checkPackageDefinition(String pkg) {
}
@Override
public final void checkPermission(Permission perm) {
}
@Override
public final void checkPermission(Permission perm, Object context) {
}
@Override
public final void checkPrintJobAccess() {
}
@Override
public final void checkPropertiesAccess() {
}
public final void checkPropertyAccess(String key) {
};
@Override
public final void checkRead(FileDescriptor fd) {
}
@Override
public final void checkRead(String file) {
}
@Override
public final void checkRead(String file, Object context) {
}
@Override
public final void checkSecurityAccess(String target) {
}
@Override
public final void checkSetFactory() {
}
@Override
public final void checkSystemClipboardAccess() {
}
@Override
public final boolean checkTopLevelWindow(Object window) {
return true;
}
@Override
public final void checkWrite(FileDescriptor fd) {
}
@Override
public final void checkWrite(String file) {
}
}