2

我想知道在哪里可以检查类加载器已加载了多少类。我想知道,import带有标记的类中的语句是否*会在堆的perm区域中加载那么多类?或者只有当我们声明特定类型的引用时才会加载以下两个类?
前任。

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

如果我们像这样写 import 语句会怎样

java.util.*;

类加载器会加载java.util包下的所有类吗?java中有没有类卸载过程?

4

4 回答 4

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 可能会推迟类加载,直到该类被实际使用,并在不再使用后立即卸载该类。这在关注内存占用的嵌入式应用程序中可能很方便。

于 2013-03-13T06:45:41.910 回答
2

imported 类(或通配符)实际上并未由类加载器加载。导入语句只是一个“别名”语句(或类似“隐式前缀”语句,以防您导入通配符)。

于 2013-03-13T06:45:40.193 回答
1

这个工具VisualVM将帮助你。

于 2013-03-13T06:41:21.610 回答
1

如果您想查看在运行时加载的类,请尝试以下操作:

java -verbose:class

你应该看看问题是否有办法获取 ClassLoader 加载了哪些类?

于 2013-03-13T07:02:18.133 回答