java虚拟机 (java virtual machine ),Java 字节码运行的地方,隔离硬件与操作系统对Java代码的影响。
本文参考 JavaPoint 网站文档:JVM | Java Virtual Machine - Javatpoint
结构:
1.类加载器
Bootstrap ClassLoader (启动类加载器) :是拓展类加载器的父类,负责加载lib目录下的包 ,如rt.jar 包里的所有class文件。
Extension ClassLoader(拓展类加载器):是应用类加载器的父类,负责加载 $JAVA_HOME/jre/lib/ext 目录下的class文件。
System/Application ClassLoader(系统/应用类加载器):加载 classPath 下的所有class文件。
拓展1:双亲委派机制,加载class文件时会优先使用父加载器加载到的文件。
拓展2:当我们尝试获取String类的加载器时,String.class.getClassLoader() 会得到 null,因为Bootstrap ClassLoader 是jvm底层使用C语言实现的,故无法获取。(ps: Null 不一定 是不存在,还可能是获取不到)。
2,方法区(Class Area)
存放class模板(pre-class structures),一个class可以实例化出多个对象放在堆中但class始终是同一个 ;常量池(constant pool);属性(field);方法信息(method data , the code for methods)。
3,堆(Heap)
运行时对象被分配的内存空间。
4,栈 (Stack)
栈由栈帧组成,每一帧包含方法局部变量(local variables)和部分结果(partial result),在方法调用和返回中发挥作用。
每一个线程有一个私有的栈,在线程创建时一同被创建。栈帧在线程调用某个方法时入栈,在方法结束后出栈。
5,程序计数器 (Program Counter Register)
程序计数器存储了jvm正在执行的指令的地址。(PC (program counter) register contains the address of the Java virtual machine instruction currently being executed.)。个人理解:cpu轮询时间片执行不同的程序,GC时线程也会暂停, 程序计数器则记录这个暂停的点。
6,本地方法栈(Native Method Stack)
存放所有的本地方法 (jvm底层用C语言实现的方法),java即C++ --。
7,执行引擎(Execution Engine)
简而言之,执行Java字节码
8,Java Native Interface
JNI 提供C,C++,Assembly 等语言的方法接口供JVM使用。
拓展 String Table ,Heap中 专门存放String 常量的数据结构 ,String str1 = "Hello World" ; hello world 会存放进String Table 中 ,再定义 String str2 = "Hello World" ,str1 与str2 指向同一内存地址。作用:在初始化时存放String 常量 减少String对象的重复创建,提高效率。