
加载->检验->准备->解析->初始化
ClassLoader parent属性中指定。默认加载 %JAVA_HOME%/lib 目录下的 jar包和class文件%JAVA_HOME%/lib/ext 下的jar包和java类classpath下的文件JVM必须确保一个类在初始化的过程中,只能允许一个线程对其执行初始化操作。
类加载器(ClassLoader)用来加载 Java 类到 Java 虚拟机中。基本上所有的类加载器都是 java.lang.ClassLoader 类的一个实例。

每一个类加载器,都拥有一个独立的类名称空间。对于任意一个类,都是由加载它的类加载器和这个类本身来确定唯一性的,即如果相同的class文件被不同的加载器所加载就属于不同的类。
比较两个类是否相等,只有在这两个类是由同一个类加载器加载的前提下才有意义。
每个类加载器都有自己的缓存空间和加载路径,加载一个类的时候会从AppClassLoader 开始向上查找每个加载器的缓存,判断缓存中是否加载了该类(findLoadedClass),如果加载了则直接返回,若到了BootstrapClassLoader(parent == null)都没有找到,则会查找 BootstrapClassLoader 的加载路径是否包含该类(findClass),如果包含则直接返回,否则继续往下查找,直到找到为止。
这就是双亲委派机制, 向上找缓存,向下找加载路径。
好处:
虚拟机栈:每个线程运行方法时需要的内存空间。
每次调用方法都将该方法压入栈中,每个方法运行时在栈中需要的内存称为栈帧。正在执行的方法对应的栈帧称为活动栈帧。
每个新线程都会开辟属于自己的虚拟机栈,也就是说虚拟机栈是线程私有的,里面放的都是局部变量,记录着返回值、返回地址等。
tips:-Xss 可设置虚拟机栈的大小,如-Xss10m 将虚拟机栈设为10m
一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现。
局部变量表(Local Variable Table)
操作数栈(Operand Stack)
动态链接(Dynamic Linking)
**返回地址(Return Address) **
本地方法:非java代码编写的方法。因为java代码不能直接与操作系统底层API打交道,需要c或c++。在java类中用native修饰的方法就是本地方法。
本地方法栈:给本地方法提供内存空间。
堆中存放着非静态全局变量和对象的实际位置(即new的对象都放在这里)。
堆中还划分了eden区、servivor区(包含From和To区)还有old区,年轻代都在eden区和servivor区,达到一定年龄的对象会进入old区。
特点: