JVM|JVM - 运行时数据区

1,JVM运行时数据区


JVM|JVM - 运行时数据区
文章图片
image.png
1)线程私有区域
pc: 程序计数器,当前线程将要执行的下一条jvm指令地址。
本地方法栈: 每个线程独立独有,调用native方法时使用。
虚拟机栈: 每个线程独有,存储栈帧,方法调用时入栈,结束时出栈。
2)线程共享区域
Heap堆: 分为s0、s1、eden、old等。几乎所有的对象实例。通过-Xms、-Xmx指定堆大小。
方法区: 存储被JVM加载的元数据。类信息(字段、方法)、常量、静态变量等。
运行时常量池: 属于方法区,包含字面量(字符串、final常量)、符号引用。
3)直接内存
不属于JVM运行时数据区,JVM的NIO方法可以分配堆外内存如使用DirectByteBuffer。 【JVM|JVM - 运行时数据区】
2,栈帧
1)栈帧:包含局部变量表、操作数栈、动态链接、返回地址。

JVM|JVM - 运行时数据区
文章图片
image.png
2)方法调用: 可以看做栈帧在虚拟机栈中从入栈到出栈的过程。
参数过多: 栈帧中局部变量表过大,该栈帧深度过大。可以将参数列表使用对象封装。
3)局部变量: 方法执行过程中需要的全部变量。包含指向当前对象this的引用、方法的参数、其他局部定义变量。
静态方法: 0位置从参数列表存储。
实例方法: 0位置存储当前对象this的引用。
4)方法调用的底层表示:
jvm调用实例方法时,会将对象引用作为第一个参数传递给方法(局部变量表0位置的this)。如:a.halo("hello"); => Halo.halo(a, "hello")
jvm调用静态方法,Halo.staticHalo("static halo"); 在static方法内部,不能直接调用非static的方法。
3,方法区
1)Method Area包含已加载的类信息
JDK1.7以后,常量池移至堆中。
方法区类信息中包含指向堆中Class实例的引用。

JVM|JVM - 运行时数据区
文章图片
image.png
2)类的方法信息
每个栈帧分配多少内存,编译器可知的。
JVM|JVM - 运行时数据区
文章图片
image.png
4,堆
1)Java Heap:分为(S0、S1、Eden)、Old区,不需要是连续的空间。

JVM|JVM - 运行时数据区
文章图片
image.png
4)JVM堆内存设置
-Xms初始堆、-Xmx最大堆、-Xmn年轻代大小、-XX:SurvivorRatio年轻代Eden和单个S区的比例。

    推荐阅读