使用SecurityManager时会降低性能吗?
我需要以下内容:
public class ExitHelper {
public ExitHelper() {
System.setSecurityManager(new ExitMonitorSecurityManager());
}
private static class ExitMonitorSecurityManager extends SecurityManager {
@Override
public void checkPermission(Permission perm) {}
@Override
public void checkPermission(Permission perm, Object context) {}
@Override
public void checkExit( final int status ) {
// this is the part I need and I don't care much about the performance issue of this method
}
}
这会对我的程序产生巨大影响吗?
例如,该程序确实打开了许多文件。如果启用了SecurityManager并在其中进行了一些登录,那么我可以说这些方法被称为很多。真的很多在这两种方法的日志记录中,普通日志记录丢失了很多。因此,将SecurityManager放置到位似乎意味着进行了大量的调用。它会比默认的SecurityManager慢吗? (默认情况下有吗?)
这是如何运作的?将检查程序的哪个部分的权限,以及检查频率?我担心两个checkPermission(...)方法。
最佳答案
会有性能上的损失,但是它可能很小,因为:
特别要注意的是,用于安全检查的调用代码在Java库代码中通常非常轻巧,例如:
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkXXX(argument, . . . );
}
如果您的安全管理器代码本身同样轻巧,那么安全检查的运行时成本应该可以忽略不计。但是,我将避免在SecurityManager本身中放置任何日志记录代码-这将是昂贵的,并且可能属于您的应用程序代码中的更高级别。
如果您想将安全管理器的开销降至最低,请使用以下方法覆盖不需要的特定checkXXX方法:
@Override
public void checkRead(String file) {
// empty method as we are happy to allow all file reads
}
最终,您将必须针对自己的特定情况进行基准测试,但“直觉”答案将是,您实际上不必为此担心。