JVM内存区
- 1.虚拟机栈
- 2.方法区
- 3.堆区
- 4.程序计数器
- 5.本地方法栈 虚拟机栈:针对线程而言是私有的,是不能被其他线程同时访问的。或者说,根本就没有被其他线程访问这一说法,虚拟机栈伴生每一个独立线程,而两个线程之间保存并行独立状态。 虚拟机栈结构内的基本单位是栈帧,栈帧对应代码中被加载的每一个方法。方法中有形参、局部变量、返回类型、返回值、对其他方法,以及引用数据类型的引用,这些在栈帧中一一对应。
-
局部变量、形参----局部变量表 -
引用数据---------动态链接 -
返回值类型--------返回值
另外在栈帧中还有操作数栈,用于对局部变量表中的数据操作,操作完后重新压入局部变量表中。至于为什么说是压入,因为局部变量表、操作数栈都是栈数据结构。
同时还可以讨论下动态链接的引用。当栈帧也就是在方法的调用中需要用到堆区实例化对象
方法区:针对线程而言是所有线程都能访问到的,其内保存的是每一个字节码加载到JVM内存【虚拟内存】中的类信息,如魔数、版本号、常量池、属性表、方法表、字段表、类索引、超类索引、接口表索引等。简述某些信息用来帮助理解类的加载。
-
常量池---记录显示的成员字段字面量
public class MyConstantTest{ public final boolean bool = true; }
-
类访问标记---标识一个类是否为final、abstract -
类、超类、接口索引表---确定类的继承关系 -
字段表---字段标签
当需要构建一个实例化对象时,我们首先应该能在堆区中找到对应的Class模板对象。而Class模板对象我们又需要通过方法区中对应信息的获取才能得到。每一个Class对象都是一个单例。
JVM常量池和运行时常量池_wen-pan的博客-CSDN博客_运行时常量池
堆区:针对线程而言是所有线程都能访问到的,其内保存的是引用型对象和数组对象。对于堆区,需要特别提到的是它是GC回收机制的“主要战场”。根据GC回收机制,将堆区分为新生代和老年代。
关于堆区这里可以引入new String()去反映常量池和堆区之间具有的联系
String str = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str==str2);
System.out.println(str==str3);
String str4 = "he"+"llo";
System.out.println(str==str4);
System.out.println(str3==str4);
本地方法栈:对底层第三方的引用,代码用native修饰的即时 程序计数器:是线程私有,用于指导每一个线程执行指令的顺序