作者:捡田螺的小男孩
来源:捡田螺的小男孩
前言
最近看了深入理解Java虚拟机第三版,整理了一些基础结构图,算是比较全的了,做一下笔记,大家一起学习。
1.Java虚拟机运行时数据区图
JVM内存结构是Java程序员必须掌握的基础。
程序计数器
- 程序计数器,可以看作当前线程所执行的字节码的行号指示器
- 它是线程私有的。
Java虚拟机栈
- 线程私有的,生命周期与线程相同。
- 每个方法被执行的时候都会创建一个"栈帧",用于存储局部变量表(包括参数)、操作数栈、动态链接、方法出口等信息。
- 局部变量表存放各种基本数据类型boolean、byte、char、short等
本地方法栈
- 与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为Native方法服务。
Java堆
- Java堆是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,在JVM启动时创建。
- 其大小通过-Xms和-Xmx参数设置,-Xms为JVM启动时申请的最小内存,-Xmx为JVM可申请的最大内存。
方法区
- 它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。-可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小。
2. 堆的默认分配图
- Java堆 = 老年代 + 新生代
- 新生代 = Eden + S0 + S1
- 新生代与老年代默认比例的值为 1:2 ,可以通过参数 –XX:NewRatio 配置。
- 默认的,Eden : from : to = 8 : 1 : 1 ,可以通过参数–XX:SurvivorRatio 来设定
3.方法区结构图
方法区是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。