关于进口声明

时间:2013-03-13 06:30:08

标签: java import classloader heap-memory

我想知道在哪里可以检查类加载器加载了多少个类。 我想知道,具有import标记的类中的*语句是否会在堆的perm区域中加载那么多类?或仅在我们声明特定类型的引用时 然后将加载两个类? 实施例

Map m = new HashMap(); //only these two classes loaded???

如果我们编写像

这样的import语句怎么办?
java.util.*;

类加载器会加载java.util包下的所有类吗? java中是否有任何类卸载过程?

4 个答案:

答案 0 :(得分:5)

不,导入与类加载无关。它只是语法糖。以下两个程序将生成完全相同的字节代码:

import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.util.prefs.*;

public class Foo
{
    private Map map = new HashMap ();
}

public class Foo
{
    private java.util.Map map = new java.util.HashMap ();
}

加载类的时间取决于JVM决策。 Java规范仅保证在首次使用之前加载和初始化类。

例如,一个JVM可能决定在应用程序启动之前以递归方式直接或间接地引用所有类。对于需要避免由类加载引起的程序执行中的非确定性暂停的实时应用程序,此类行为可能很方便。另一个JVM可能会延迟类加载,直到实际使用该类,并在不再使用它后立即卸载类。这在内存占用问题的嵌入式应用程序中可能很方便。

答案 1 :(得分:2)

import ed类(或通配符)实际上并未由类加载器加载。 import语句只是一个“别名”语句(或者在您导入通配符时类似“隐式前缀”语句)。

答案 2 :(得分:1)

此工具VisualVM可以为您提供帮助。

答案 3 :(得分:1)

如果要查看在运行时加载的类,请尝试:

java -verbose:class

您应该查看问题Is there a way to get which classes a ClassLoader has loaded?