在实施安全管理器问题之后,我有一些经验证据可以在这里做出贡献:
除了对 System.exit 进行单一检查调整外,与 NO 安全管理器相同的 java SecurityManager
这个匿名内部类对性能的影响是巨大的:
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 中证实了这一点。
所以我觉得“可以忽略不计”可能是轻描淡写(我的用例甚至没有实际执行任何检查!)。将此视为轶事,事实并非如此。
作为另一个旁注:我创建了一个最终类,对所有方法进行无操作检查以避免实例化权限对象等(最终鼓励 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) {
}
}