不同虚拟机的运行时数据区可能略微有所不同,但都会遵从 Java 虚拟机规范, Java 虚拟机规范规定的区域分为以下 5 个部分:
程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成;
Java 虚拟机栈(Java Virtual Machine Stacks):用于存储局部变量表、操作数栈、动态链接、方法出口等信息;
本地方法栈(Native Method Stack):与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java 方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;
Java 堆(Java Heap):Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存;
方法区(Methed Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
运行时数据区包括堆、方法区、栈、本地方法栈、程序计数器。 1、堆 堆解决的是对象实例存储的问题,垃圾回收器管理的主要区域。 2、方法区 方法区可以认为是堆的一部分,用于存储已被虚拟机加载的信息,常量、静态变量、即时编译器编译后的代码。 3、栈 栈解决的是程序运行的问题,栈里面存的是栈帧,栈帧里面存的是局部变量表、操作数栈、动态链接、方法出口等信息。 (1)栈帧 每个方法从调用到执行的过程就是一个栈
主要内容:1.图解对象分配过程,2.Minor GC、Major GC、Full GC,3.TLAB(线程私有缓存区域)1.图解对象分配过程 特殊情况 2.Minor GC、Major GC、Full GC 部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为: 新生代收集(Minor GC/Young GC):只是新生代的垃圾收集 老年代收集(Major GC/Old GC):只是老年代的垃圾收集 混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集 整堆收集(Full
主要内容:1.堆的细分内存结构,2.设置堆内存大小与OOM,3.年轻代与老年代1.堆的细分内存结构 JDK 7以前: 新生区+养老区+永久区 Young Generation Space:又被分为Eden区和Survior区Young/New Tenure generation Space:Old/Tenure Permanent Space:Perm JDK 8以后: 新生区+养老区+元空间 Young Generation Space:又被分为Eden区和Survior
主要内容:01 内存,02 分区介绍,03 线程,2.1 JVM系统线程,1.程序计数器(PC寄存器)01 内存 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了JAVA在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的jvm对于内存的划分方式和管理机制存在着部分差异(对于Hotspot主要指方法区) (图源阿里)JDK8的元数据区+JIT编译产物 就是JDK8以前的方法区 02 分区介绍 java虚拟机定
本文向大家介绍JVM运行时数据区原理解析,包括了JVM运行时数据区原理解析的使用技巧和注意事项,需要的朋友参考一下 前言 Java虚拟机定义了若干种程序运行期间会使用的运行时数据区域,其中一些会随着虚拟机启动而创建,随着虚拟机的退出而销毁。另外一些则是和线程一一对应,这些与线程对应的数据区域随着线程开始而创建,线程的结束而销毁。 PC寄存器 PC寄存器是一块较小的内存空间,可以看作是当前线程所执行
主要内容:操作数栈(Operand Stack)操作数栈(Operand Stack) 栈 :可以使用数组或者链表来实现 每一个独立的栈帧中除了包含局部变量表以外,还包含一个后进先出的操作数栈,也可以成为表达式栈 操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈(push)或出栈(pop) 某些字节码指令将值压入操作数栈,其余的字节码指令将操作数取出栈,使用他们后再把结果压入栈。(如字节码指令bipush操作) 比如