JVM内存模型

117 阅读3分钟

JVM内存区

  • 1.虚拟机栈
  • 2.方法区
  • 3.堆区
  • 4.程序计数器
  • 5.本地方法栈 虚拟机栈:针对线程而言是私有的,是不能被其他线程同时访问的。或者说,根本就没有被其他线程访问这一说法,虚拟机栈伴生每一个独立线程,而两个线程之间保存并行独立状态。 虚拟机栈结构内的基本单位是栈帧,栈帧对应代码中被加载的每一个方法。方法中有形参、局部变量、返回类型、返回值、对其他方法,以及引用数据类型的引用,这些在栈帧中一一对应。
  • 局部变量、形参----局部变量表
    
  • 引用数据---------动态链接
    
  • 返回值类型--------返回值
    

另外在栈帧中还有操作数栈,用于对局部变量表中的数据操作,操作完后重新压入局部变量表中。至于为什么说是压入,因为局部变量表、操作数栈都是栈数据结构。

同时还可以讨论下动态链接的引用。当栈帧也就是在方法的调用中需要用到堆区实例化对象

方法区:针对线程而言是所有线程都能访问到的,其内保存的是每一个字节码加载到JVM内存【虚拟内存】中的类信息,如魔数、版本号、常量池、属性表、方法表、字段表、类索引、超类索引、接口表索引等。简述某些信息用来帮助理解类的加载。

  • 常量池---记录显示的成员字段字面量
    

public class MyConstantTest{ public final boolean bool = true; }

  • 类访问标记---标识一个类是否为finalabstract
    
  • 类、超类、接口索引表---确定类的继承关系
    
  • 字段表---字段标签
    

当需要构建一个实例化对象时,我们首先应该能在堆区中找到对应的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修饰的即时 程序计数器:是线程私有,用于指导每一个线程执行指令的顺序

接下来可以简述的是字节码信息加载到JVM这一个过程的具体执行,包括类加载机制双亲委派机制,字节码的加载、链接、初始化。

接下来还可以谈的是垃圾回收机制在JVM中的运用。

还可以的话那就去通过反编译认识字节码,认识JVM中的数据结构、Lambda、反射、泛型、Synchronized。