Java 虚拟机运行时数据区域包括程序计数器、虚拟机栈、本地方法栈、堆、方法区等
程序计数器
当前线程执行的虚拟机字节码的行号指示器,字节码解释器通过改变计数器的值来选取下一条要执行的字节码指令地址
虚拟机栈
java方法执行的内存模型,虚拟机栈就是有栈帧的容器,每一个方法调用就是栈帧在vm stack 进出的过程
栈帧
每个方法执行时都会创建一个栈帧,其内部包含:
- 局部变量表:存放方法参数和方法内定义的局部变量,以索引方式引用,存储单元称为slot
- 操作数栈:后人先出,字节码指令往操作数栈值写入提取内容
- 动态链接:对应的是即时编译后Class文件存储的方法体引用地址
- 方法返回地址:正常退出通俗讲就是返回方法调用处,当前栈帧出栈,班返回值压入调用者的操作数栈,调用程序计数器执行下一指令;异常退出:本方法异常表没有搜索到匹配的异常处理器(没有try catch异常)
方法区(非堆、永久代 Permanent Generation)
线程共享的内存区域,存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。默认最小值为16MB,最大值为64MB,可以通过
-XX:PermSize
和-XX:MaxPermSize
参数调整运行时常量池
方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区的运行时常量池中
堆 heap
也称Java 堆、GC堆是java虚拟机所管理的内存中最大的一块内存区域,是线程共享的内存区域,在JVM启动时创建,存放对象实例及数组。通过
-Xms512m
和-Xmx512m
调整jvm运行内存大小,默认设置为一致
命令 | 阈值 | 描述 |
---|---|---|
-Xms512m | 物理内存的1/64但小于1G,一理论为服务器内存的1/2-3/4之间 | JVM启动时申请的最小内存 |
-Xmx512m | 同Xms一致 | JVM启动时申请的最大内存 |
-XX:MinHeapFreeRatio=40 | 小于阈值增大到Xmx | 默认40% |
-XX:MaxHeapFreeRation=70 | 大于阈值减小到Xms | 默认70% |
下图是根据理解所画
有疑问不妥之处请留言讨论