Java虚拟机学习-(2)内存区域

一、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:最大直接内存

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章