Java虚拟机
类加载器子系统
用于将编译好的.Class文件加载到JVM中
运行时数据区
线程私有区域
虚拟机栈
为执行Java方法服务。每个方法执行的时候都会创建一个栈帧,用于存储局部变量表、操作数、动态链接和方法返回等信息,当线程请求的栈深度超过了虚拟机允许的最大深度时,就会抛出StackOverFlowError;
栈帧
局部变量表
操作数
动态链接
方法返回
本地方法区
为Native方法服务,保存的是native方法的信息,当一个jvm创建的线程调用native方法后,jvm不会在虚拟机栈中为该线程创建栈帧,而是简单的动态链接并直接调用该方法;
程序计数器
是一块很小的内存空间,作为当前线程的信号指示器,用于记录当前虚拟机正在执行的线程指令地址
线程共享区域
虚拟机堆/Java堆
JVM运行过程中产生的对象和数据都被存储在堆中,包括jdk8后的运行时常量池
新生代 1/3 堆空间
Eden区 默认占 8/10新生代空间
SurvivorFrom区 1/10
SurvivorTo区 1/10
老年代 2/3 堆空间
所有线程共享的一块内存,几乎所有对象的实例和数组都要在堆上分配内存,因此该区域经常发生垃圾回收的操作;
方法区/永久代
Java8中永久代被元空间取代,元空间没有使用虚拟机的内存,直接使用操作系统的本地内存,因此不受JVM内存的限制。
方法区和java堆一样,是各个线程共享的内存区域,虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫Non-Heap,目的是为了与java堆区分开来。
存储已被虚拟机加载的
Class和Meta(元数据)信息
类信息
类的静态变量
运行时常量池
常量
即时编译后的代码
直接内存/堆外内存
并不属于JVM运行时数据区内容
NIO模型通过调用Native函数库直接在操作系统上分配堆外内存
Java进程通过堆外内存技术避免在Java堆和Native堆中来回复制数据带来的资源浪费和性能消耗
执行引擎
即时编译器
用于将Java字节码编译成具体的机器码
垃圾回收器
用户回收在运行过程中不再使用的对象
本地接口库
通过调用本地方法库,
完成具体的指令操作
与操作系统交互
与操作系统交互
所有线程共享的一块内存,几乎所有对象的实例和数组都要在堆上分配内存,因此该区域经常发生垃圾回收的操作;
JVM虚拟机知识图谱
最新推荐文章于 2025-05-28 16:30:26 发布