JVM
JVM
.class文件
平台无关性
类加载器
-
启动类加载器(Bootstrap ClassLoader):负责加载JDK中的核心类库
-
扩展类加载器(Extension ClassLoader):负责加载Java的扩展类库
-
系统类加载器(App ClassLoader):负责加载应用程序classpath目录下所有jar和class文件。
方法区
方法区用于存储JVM加载完成的类型信息、常量、静态变量、即时编译器编译后的代码缓存,方法区和 Java 堆区一样,都是线程共享的内存区域。
Java堆(JVM堆、Java heap)
-
堆区负责存放对象实例,当Java创建一个类的实例对象或者数组时,都会在堆中为新的对象分配内存。
-
虚拟机中只有一个堆,程序中所有的线程都共享它。
-
通常情况下,堆占用的内存空间是最多的。
-
堆的存取方式为管道类型,先进先出。
-
在程序运行中,可以动态的分配堆的内存大小。
-
堆的内存资源回收是交给JVM GC进行管理的,
虚拟机栈(JVM栈、VM Stack)
-
在Java栈中只保存基础数据类型和对象的引用,注意只是对象的引用而不是对象本身哦,对象是保存在堆区中的。
-
每个线程都会建立一个栈,每个栈又包含了若干个栈帧,每个栈帧对应着每个方法的每次调用,栈帧包含了三个部分:[1]局部变量区(方法内基本类型变量、对象实例的引用);[2]操作数栈区(存放方法执行过程中产生的中间结果);[3]运行环境区(动态连接、正确的方法返回相关信息、异常捕捉);
本地方法栈(Native Method Stack)
-
本地方法栈的功能和JVM栈非常类似,区别在于虚拟机栈执行的是Java方法,本地方法栈执行的是本地(Native)方法服务,存储的也是本地方法的局部变量表,本地方法的操作数栈等信息。
-
栈内的数据在超出其作用域后,会被自动释放掉,它不由JVM GC管理。
程序计数器
每条线程都会有一个独立的程序计数器。
JVM执行引擎
主要职责,就是把这些自行制定的指令集翻译成硬件所支持的指令集格式,然后执行。
本地方法接口(JNI)
JNI是Java Native interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C和C++)。
JVM GC(垃圾回收机制)
常量池
Class常量池
在JVM把Class文件加载完成后,Class 常量池里的数据会存放到运行时常量池中。
运行时常量池(Runtime Constant Pool)
运行时常量池是方法区(Method Area)的一部分,运行时常量池中存储的,是基本类型的数据和对象的引用
字符串常量池(String Constant Pool) & 其他包装类型里实现的常量池