1、JAVA数据运行区
- java源文件通过javac编译成java字节码文件.class
- 通过类加载器ClassLoader加载.class文件,将class文件放入内存中各个区域
- 程序计数器、JAVA虚拟机、本地方法栈是线程独有的,不受GC管理
- 堆、方法区受GC管理
java8 方法区又称为非堆区,在内存结构中称为“元数据”。
下面主要讲ClassLoader双亲委派和沙箱安全机制
2、ClassLoader双亲委派机制
加载流程:
- 当AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader去完成。
- 当ExtClassLoader加载一个class时,它首先也不会自己去尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader去完成。
- 如果BootStrapClassLoader加载失败(例如在$JAVA_HOME/jre/lib里未查找到该class),会使用ExtClassLoader来尝试加载;
- 若ExtClassLoader也加载失败,则会使用AppClassLoader来加载,如果AppClassLoader也加载失败,则会报出异常ClassNotFoundException。
3、沙箱安全机制
沙箱安全机制是由基于双亲委派机制上 采取的一种JVM的自我保护机制,假设你要写一个java.lang.String 的类,由于双亲委派机制的原理,此请求会先交给Bootstrap试图进行加载,但是Bootstrap在加载类时首先通过包和类名查找rt.jar中有没有该类,有则优先加载rt.jar包中的类,因此就保证了java的运行机制不会被破坏.