本篇涉及到JVM的几个知识点,也是面试题目中比较常见的
1 什么是类加载器
2 类加载器有几种
3 双亲委派机制是什么
4 沙箱安全
5 手撕JVM结构图
JVM是运行在操作系统之上的,和硬件没有直接交互
JVM结构图如下
类装载器ClassLoader是什么:负责加载class文件,class文件在文件开头有特定的文件标识,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构。ClassLoader只负责class文件的加载,是否能运行是Execution Engine决定
多种ClassLoader
虚拟器自带加载器
启动类加载器Bootstrap (c++写的)那些类加载过了一上来直接就能用
扩展类加载器Extension(java写的) ExtClassLoader
是ClassLoder
的子类,负责装载JRE
扩展目录ext
下的jar
类包。 扩展类加载器 Extension 后期版本加的
应用程序类加载器AppClassLoader 也叫系统类加载器,加载当前classpath的所有类
用户自定义加载器
Java.lang.ClassLoader的子类,用户可以定制类的加载方式
我们看如下代码:
Object obj = new Object();
System.out.println(obj.getClass().getClassLoader());
这个得到的是BootStrap,显示是Null
MyObject mo = new MyObject();
System.out.println(mo.getClass().getClassLoader().getParent().getParent());
System.out.println(mo.getClass().getClassLoader().getParent());
System.out.println(mo.getClass().getClassLoader());
结果是
null
sun.misc.Launcher$ExtClassLoader@15db9742
sun.misc.Launcher$AppClassLoader@73d16e93
双亲委托机制
从顶到底找,避免安全问题,不污染代码。当一个类收到了类加载请求,他首先不会自己区加载这个类,而是把请求委派给父类去完成,每个层次 到类加载器都是如此,因此所有请求都会先到地洞类加载器中(BootStrap),当父类没法完成,字类才会自己去加载。这样保证了使用不同的类加载器都能得到同一个Object对象。自己也找不到就会报ClassNotFoundException
其他
native : 跟java无关的需要调用底层系统的方法,放在本地方法栈中。有声明,无实现
程序计数器:每个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法去中的方法字节码(用来存储指向下一条指令的地址),由执行引擎读取下一条指令。非常小的空间,可以忽略不计。是当前线程所执行的字节码行号指示器。如果是native方法,计数器是空的(不归java管)。