【问题标题】:Why does the simple code load many classes?为什么简单的代码会加载很多类?
【发布时间】:2013-03-25 04:50:38
【问题描述】:

这是一个非常简单的代码:

package test;
public class Test {
    public static void main(String[] args) {
        System.out.println("test");
    }
}

我运行它:java -verbose:class Test,以下是输出。为什么要加载这么多类? Java 加载类不是按需加载吗?

[Opened C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.Object from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.io.Serializable from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.Comparable from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.CharSequence from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.String from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.reflect.GenericDeclaration from C:\Program        Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.reflect.Type from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.reflect.AnnotatedElement from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.Class from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.Cloneable from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.ClassLoader from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.System from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.Throwable from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.Error from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
...
test
[Loaded java.lang.Shutdown from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]
[Loaded java.lang.Shutdown$Lock from C:\Program Files\Java\jdk1.7.0_11\jre\lib\rt.jar]

【问题讨论】:

标签: java classloader


【解决方案1】:

类本身可以以传递的方式加载类。您的程序使用了System 类,它本身可能引用诸如java.io.Serializable 这样的系统类。

您列表中的类也恰好是非常常用的类。可能只是虚拟机正在强制加载它们,以避免延迟初始化。这些类肯定会在任何重要的程序中使用。

【讨论】:

    【解决方案2】:

    在 java 中,一个类至少引用另一个类(称为 Object)。 JVM 识别这些引用(例如扩展、返回类型、字段类型、实现)并加载引用的类。

    在上面的例子中:

    到 Java VM 在类未加载时加载它们

    package test;
    public class Test {
      public static void main(String[] args) {
        System.out.println("test");
      }
    }
    

    您的班级参考: System、Object、Class、String、反射包中的一些类等等。

    您在上面列出的这些类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 2015-02-19
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      相关资源
      最近更新 更多