类加载器干了什么事情?
第一步:加载
第二步:验证
第三步:准备
第四步:解析
第五步:初始化
第六步:使用
第七步:卸载
加载:
将class 文件加载进去
验证:
1、验证class文件的版本和能不能兼容当前JVM版本。
2、验证class文件是否满足JVM规范(class文件的第一个字节码为‘魔术值’),为16进制的代码(3DEF5…)
准备:
举例:public static int xx = 100; 定义了一个加上static关键字的变量值,是跟着类文件走的。
把类成员初始化为初始值(初始值是Java内定的初始值,不是自己给予的初始值),final的类变量除外。(final 字段直接初始化为自己设定的值)
解析:
把符号引用解析为直接引用(类似于将英文转为内存地址可以直接访问)
符号引用:就是我们写的xx变量,xx对象的引用,如 Integer xxx = new Integer();
xxx 就是符号引用.
直接引用:
就是内存地址。 0x0000001
解析就是要把类似于xxx,xx这种符号引用替换为直接引用即内存地址。
初始化:
把我们定义的static变量或者static静态代码块按顺序组织成 构造器(也称作类构造器)来初始化变量。
就是将自己定义的数据赋值给变量。也就是存放在对应的内存地址中。
方法区:
所有关于类的信息都是保存在 方法区中。
怎么保存?通过常量池来保存。生成了一个代表所有类信息的对象classInstance。
字节码:
javap -c xxx
将指定字节码反编译为字节码指令输出
本地方法栈:
JNI 将C语言或者C++ 编码的程序压缩在JNI中执行。
堆内存:
堆内存是多线程共享的,所以当多线程共同访问堆内存中公共资源的时候,要保证堆内存中数据的安全性。
线程栈是线程独有的。代表每个线程都拥有独立的线程栈(堆栈)
TLspace: 多线程中,优先在自己的线程栈中创建使用,如果独有的线程栈不够用了,就会在堆内存中创建使用。