我希望能够找出正在运行的JVM多长时间访问一次磁盘,以及在可能的情况下对其进行访问。
例如,我想知道:通过ImageIO加载图像是否真的将其加载到内存中,还是只是创建一个指向文件的指针并在其真正绘制到屏幕时访问它?诸如此类。有没有办法做到这一点?
更新,我添加了这个:
public class SecurityManagerExtension extends SecurityManager {
@Override
public void checkRead(FileDescriptor fd)
{
logger.error("reading file1: {}", fd.toString());
super.checkRead(fd);
}
@Override
public void checkRead(String file)
{
logger.error("reading file2: {}", file);
super.checkRead(file);
}
@Override
public void checkRead(String file, Object context)
{
logger.error("reading file3: {} in context {}", file, context.toString());
super.checkRead(file, context);
}
}
我已经设置了安全管理器:
SecurityManagerExtension secMan = new SecurityManagerExtension();
java.lang.System.setSecurityManager(secMan);
现在,新的问题是:基本上,我加载或加载的每个文件,除类文件外,似乎都会引起如下的StackTrace:
引起原因:java.security.AccessControlException:访问被拒绝(“ java.io.FilePermission”“ C:\ Program Files \ Java \ jdk-13.0.1 \ bin \ awt.dll”“读取”)
如果我注释掉setSecurityManager()行,一切将再次正常运行。我什至尝试授予我的用户对JDK目录的完全访问权限,因此这不是真正的权限问题。它不是,因为如果我恢复为默认设置,则一切将再次正常运行。
我究竟做错了什么?
我想到两种可能的方法:
#1:自定义安全策略
您可以通过扩展java.lang.SecurityManager
和安装(java.lang.System.setSecurityManager
)来实施自己的安全策略。这个类提供checkRead
/ checkWrite
/ checkDelete
方法,即得到尽快称为代码试图读取/写入/删除文件。这使您可以记录所有基于Java的文件访问。但是,这不能在字节级别上进行。
默认情况下,未安装安全管理器。默认策略仅对中的代码启用文件系统访问java.ext.dirs
。要变通解决此问题,可以在设置安全管理器之前按如下所示设置最小策略:
System.setProperty("java.security.policy", "<policy-path>");
最小政策:
grant {
permission java.security.AllPermission "", "";
};
#2:通过OS级跟踪器监视I / O
在Windows上,可以使用Process Monitor记录I / O。在Linux上,您可以使用strace进行相同的操作。其他平台也提供类似的功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句