关于进口声明

Ami*_*itG 2 java import heap-memory classloader

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

Map m = new HashMap(); //only these two classes loaded???
Run Code Online (Sandbox Code Playgroud)

如果我们写import语句怎么样?

java.util.*;
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*rov 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 ();
}
Run Code Online (Sandbox Code Playgroud)

public class Foo
{
    private java.util.Map map = new java.util.HashMap ();
}
Run Code Online (Sandbox Code Playgroud)

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

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