JVM内存模型和类加载
内存模型
JVM内存模型主要分为堆、程序计数器、方法区、虚拟机栈和本地方法栈。
堆
堆中包含了字符串常量池。
程序计数器
记录线程执行的字节码的地址。
方法区
存放已被虚拟机加载的类相关信息,包括类信息、运行时常量池(存放编译生成的字面量和符号引用)。
当类加载到内存后,JVM把类文件常量池中的内容存到运行时常量池。
虚拟机栈
管理Java函数的调用,线程私有的内存空间,保存方法的局部变量和返回地址等。
本地方法栈
管理C语言实现的本地方法的调用。
类加载
ClassLoader负责把编译器生成的class字节码文件加载到JVM中执行。
当加载Hello.class时,不考虑自定义类加载器,先按蓝色箭头向上,直到顶点后按红色箭头向下,如果没有任何加载器能加载则抛出ClassNotFoundException。
这种设计的好处:当有人篡改了String.java的实现,系统级别的类之前已经被BootstrapClassLoader加载过了,其他类加载器没有机会再去加载,防止危险代码的植入。