JVM

JVM

.class文件

平台无关性

类加载器

  1. 启动类加载器(Bootstrap ClassLoader):负责加载JDK中的核心类库

  2. 扩展类加载器(Extension ClassLoader):负责加载Java的扩展类库

  3. 系统类加载器(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) & 其他包装类型里实现的常量池

 

posted @ 2024-03-28 15:01  Si_wuxie  阅读(26)  评论(0编辑  收藏  举报