使用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(...)方法。

最佳答案

会有性能上的损失,但是它可能很小,因为:

  • 仅当您尝试某种需要权限检查的 Activity 时,它才适用。
  • 大多数需要权限检查的操作都是昂贵的操作(IO,网络访问等),因此安全检查的开销很可能只占总运行时间的很小一部分。
  • 支票本身可以非常便宜地进行

  • 特别要注意的是,用于安全检查的调用代码在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
    }
    

    最终,您将必须针对自己的特定情况进行基准测试,但“直觉”答案将是,您实际上不必为此担心。

    10-08 17:58