JVM(JAVA virtual machine)
1.jvm运行在操作系统之上,操作系统运行在硬件系统(Intel系统等)之上jvm与硬件系统是没有交互的。
2.jvm体系架构分为5个部分
ClassLoader:
class静态文件由ClassLoader负责加载并初始化生成Class模板放在方法区中。
运行时数据区:
jvm运行时数据区(Runtime Data Area)包括5个区域:堆内存、方法区、栈、程序计数器、本地方法栈。
堆内存和方法区是线程共享,GC只负责处理堆内存和方法区内的垃圾回收。
栈、本地方法栈、程序计数器是线程独有的。
程序计数器(PC寄存器):每个线程都有一个程序计数器,是线程私有的,本质上就是一个指针。
执行引擎:
执行引擎(Execution Engine)负责从java栈中获取执行的代码然后翻译成操作系统可识别的命令,交给操作系统去执行。
本地方法:
本地接口和本地方法库,是为了融合其他的编程语言为java所用。java是从1995.5.23诞生,当时是C、C++的统治时代,迫于无奈,引入了本地接口与本地方法库。
于是在内存中特地引入了本地方法栈,用于登记native方法。执行引擎执行时就会加载本地方法库。
3.ClassLoader类加载器
Class文件是一个静态文件,如果要被加载到内存中,需要ClassLoader进行装载进入内存。ClassLoader只负责类的加载,并不负责执行,执行的过程由Execution Engine负责。
4中类加载器:
BootStrap ClassLoader 启动类加载器
负责加载jre/lib/下的所有类库。由C、C++语言编写,所以在JAVA程序中获取这个累加器时会返回Null,不是因为没有,而是因为底层是有其他语言编写的。
Extension Classloader 扩展类加载器
负责加载jre/lib/ext下的类库
App ClassLoader 系统类加载器
负责加载ClassPath路径的jar文件
User-Definied 自定义加载器
继承 java.lang.ClassLoader类实现里面的方法,自定义加载类的方法
双亲委派机制
双亲委派机制:当类加载器收到类加载的请求,不会直接去加载该类,而是将请求委派给父类加载器去加载,其他加载器也会如此。直到该请求传递给启动类加载器(BootStrap ClassLoader),启动类加载器会去加载该类。如果加载完成,其余加载器就不在加载。如果加载失败,就会通知子加载器去加载。加载不到,继续通知子类加载。
系统类加载器(AppClassLoader)委派给扩展类加载器(ExtentionClassLoader),扩展类加载器委派给根加载器(BootStrapClassLoader)。根加载器加载不到,才由系统类加载器加载。【儿子委托给爸爸去加载】
双亲委派机制的意义:
1、 保证运行环境中一个类文件只对应一份字节码文件。
2、 保证系统类的安全,不让JDK中的代码被篡改
沙箱机制
沙箱机制是目标,双亲委派机制是实现。沙箱机制是JVM的自我保护机制。
如果你手动写了java.lang.string 类,加载该类时,首先请求会被系统类加载器接收,系统类加载会把请求委派给Extention ClassLoader去加载,Extention Classloader又会把请求委派给根加载器BootStrap ClassLoader加载。根加载器根据包名+类名会在lib/rt.jar中去查找,有就会去加载。因此保证了JVM的运行机制不会被破坏。
报错原因:AppClassLoader委派给ExtentionCalssLoader,ExtentionClassLoader委派给启动类加载器BootStrapClassLoader加载。根加载器发现rt.jar中有一个java.lang.string 方法,然后运行。发现没有main方法。执行报错。
Native Interface 本地方法接口
本地接口的作用:融合不同的语言编程语言为JAVA所用。