如果有的话,使用SecurityManager会有什么性能损失

Ced*_*tin 9 java security securitymanager

使用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
        }
}
Run Code Online (Sandbox Code Playgroud)

这会对我的计划产生巨大影响吗?

例如,该程序确实打开了很多文件.如果我启用SecurityManager并在那里放入一些日志,我可以调用这些方法.真的很多.在这两种方法的记录中丢失了正常的日志记录.因此,将SecurityManager置于适当的位置意味着可以进行大量的调用.它会比默认的SecurityManager慢吗?(默认情况下有吗?)

这是如何运作的?将检查程序的哪个部分的权限和频率?我关注两个checkPermission(...)方法.

mik*_*era 7

存在性能损失,但可能很小,因为:

  • 它仅适用于您尝试某种形式的需要权限检查的活动时.
  • 大多数需要权限检查的操作都是昂贵的操作(IO,网络访问等),因此安全检查的开销很可能在总运行时间中占很小的比例.
  • 支票本身可以非常便宜

特别要注意的是,安全检查的调用代码在Java库代码中通常非常轻量级,例如:

 SecurityManager security = System.getSecurityManager();
 if (security != null) {
     security.checkXXX(argument,  . . . );
 }
Run Code Online (Sandbox Code Playgroud)

如果您的安全管理器代码本身同样轻量级,那么安全检查的运行时成本应该可以忽略不计.我会避免在SecurityManager本身中放入任何日志记录代码 - 这将是昂贵的,并且可能属于应用程序代码中的更高级别.

如果您希望绝对最小化安全管理器对您不关心的权限的开销,那么您应该使用以下内容覆盖您不需要的特定checkXXX方法:

@Override 
public void checkRead(String file) {
  // empty method as we are happy to allow all file reads
}
Run Code Online (Sandbox Code Playgroud)

最终你必须根据你的具体情况进行基准测试,但"直觉"的答案是你不应该真的担心它.