什么时候调用ClassLoader的checkPackageAccess方法

时间:2018-08-07 12:15:04

标签: java jvm classloader securitymanager classloading

我想了解JVM何时调用ClassLoader的checkPackageAccess方法。从javadoc中,我读到在用类加载器加载类之后,JVM调用了它。但是我发现有时在装入一个类后会多次调用它。 JVM根据什么决定决定调用它。如果有人可以澄清该方法,我将不胜感激。

为了更容易理解,这是我所做的:

  1. 我两次运行相同的程序。两次都使用-noverify
  2. 在一次运行中,我从类中删除了<clinit>,而在另一次运行中,则没有。

使用<clinit>进行的运行如下所示: Run with clinit

没有这样的人: Run without clinit

因此,您可以看到,在装入checkPackageAccess之后,没有clinit的运行导致对java.sql.DriverPropertyInfo的三个调用,而正常运行(带有clinit的运行)仅导致一个调用。由于在两次运行中都未执行<clinit>(第二次运行中都不是原始运行,也不是空运行),所以我想知道是什么导致JVM执行此checkPackageAccess调用。

  • 第一个checkPackageAccess用于java.sql.DriverPropertyInfo(在
    都运行)
  • 第二个是java.util.concurrent.ConcurrentHashMap
  • 第三个是java.lang.ref.ReferenceQueue

我使用JVMTI methodEntry和methodExit事件来生成所有正在发生的事件的跟踪。但是,我无法解释是什么导致了这些额外的checkPackageAccess调用。

0 个答案:

没有答案