一、JVM内存布局

1.虚拟机栈
栈里存放的内调数据,叫
栈帧。
每个栈帧都包含四个区域:局部变量表、操作数栈、动态连接、返回地址
局部变量表:方法参数、方法内部定义的局部变量。
操作数栈:运行时操作码操作的的操作数。
动态连接:Class文件的常量池中有大量符号引用,字节码中的方法调用指令就以常量池中指向方法的符号引用为参数。有些符号引用在运行期间转化为直接引用,这部分叫动态连接。
返回地址:方法被调用的位置,其中方法退出分两种,正常完成出口、异常完成出口。


这里的执行包含两个栈,一个是虚拟机栈,一个是操作数栈。
虚拟机栈的栈帧对应着某个方法,操作数栈的操作数则体现方法的执行。
其中,虚拟机栈中的栈帧,有个返回地址,直接返回指令的内存地址指针,类似于opcode操作码;而操作数栈存放的操作数。
2.程序计数器
当前线程所执行的字节码的行号,当前线程的执行进度。
javap可以输出代码的字节码指令。
3.堆
程序中大多数对象存储在堆,程序启动就会申请内存。
基本数据类型:在虚拟机栈分配内存。
普通类型对象:在堆分配内存,虚拟机栈存引用。
4.元空间
类的信息、常量池、方法数据、方法代码。
java7 是存储在Perm区, 是在堆空间的。 java8是存储在元空间的。方法区的概念依然存在,是在元空间。
字符串常量,是在堆中,常量池存放引用。
5.直接内存
不是JVM运行时数据区域,也不是JVM规范定义的内存区域。不受Java堆内存设置影响。常见的有Buffer的I/O缓冲区。
二、各区域参数设置
1.虚拟机栈与本地方法栈
-Xss:设置单个栈容量
2.堆
-Xms:堆最小内存
-Xmx:堆最大内存
-XX:+HeapDumpOnOutOfMenoryError:堆内存溢出时Dump出内存快照
3.元空间(永久代)
-XX:MaxMetaspaceSize:元空间最大内存(jdk1.8)
-XX:PermSize:永久代最小内存(jdk1.7)
-XX:MaxPermSize:永久代最大内存(jdk1.7)
4.本机直接内存
-XX:MaxDirectMemorySize:最大直接内存