标签:最可 lin java 默认 lazy 机制 cat 返回 tar
将常量池内的符号引用转化为直接引用
<clinit>()
的过程,<clinit>()
是编译器自动收集所有类变量的赋值动作和静态代码块中的语句合并生成。<clinit>()
不同于类的构造器(构造器对应虚拟机视角下的<init>()
),若该类有父类,父类<clinit>()
方法会在子类的<clinit>()
方法前调用。<clinit>()
方法在多线程下被同步加锁,保证一个类只被加载一次。顶层类加载器底层C++实现,主要加载<JAVA_HOME>\lib目录下且被JVM能识别的类库至内存
主要负责加载<JAVA_HOME>\lib\ext目录下的一些扩展的jar,开发者可直接使用的加载器。
使用ExtClassLoader.getParent得到的加载器为null?是否说ExtClassLoader的父类加载器为null?
public abstract class ClassLoader {
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
synchronized (lock) {
...
if (target == null) {
try {
if (parent != null) {
target = parent.loadClass(name, false);
} else {
// 所有父类加载器为null的加载器,其父类都为启动类加载器BootstrapClassloader
target = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {...}
...
}
}
private Class<?> findBootstrapClassOrNull(String name){
if (!checkName(name)) return null;
return findBootstrapClass(name);
}
private native Class<?> findBootstrapClass(String name);// native方法,通过JNI调用底层C
主要负责加载用户类路径(ClassPath)下的所有类库,父类加载器为ExtClassLoader。
Java虚拟机对class文件采用按需引入,即需要使用该类时才会将他的class文件加载到内存生成class对象。
确保类的全局唯一性通过双亲委托机制,Java虚拟机总是先从最可信的Java核心API查找类型,可以防止不可信的类假扮被信任的类对系统造成危害。
线程私有,生命周期与线程相同,每个方法执行时同步创建一个栈帧(Stack Frame),栈帧存储了方法的存储局部变量表、操作栈、动态链接、返回地址等信息
线程共享,在虚拟机启动时创建。存储对象实例及数组,GC的主要作用区域。
线程共享内存区域,存储已被虚拟机加载的类型信息
标签:最可 lin java 默认 lazy 机制 cat 返回 tar
原文地址:https://www.cnblogs.com/heyufeng0313/p/14747004.html