杭州群游科技网站做的魔域,个人网站收款,许昌网络公司,凡科快图官方下载JVM即Java虚拟机#xff0c;是Java实现跨平台交互能力的核心#xff0c;Java编译后的.class文件#xff0c;就是通过虚拟机和操作系统进行交互的#xff1b;
常见的虚拟机有#xff1a;JVM、VMwave、Virtual Box#xff0c;目前最主流使用的JVM是HotSpot VM#xff1b;…JVM即Java虚拟机是Java实现跨平台交互能力的核心Java编译后的.class文件就是通过虚拟机和操作系统进行交互的
常见的虚拟机有JVM、VMwave、Virtual Box目前最主流使用的JVM是HotSpot VM
JVM 的内存区域划分主要分为这几个部分本地方法栈程序计数器虚拟机栈堆区元数据区 此处的 栈 与数据结构的栈是不一样的概念此处的栈指的是 JVM 中的一个特定存储空间 一个 JVM 对应一个 Java进程这也是为了进程之间保持一定的隔离性 本地方法栈native 表示 JVM 内部的 C 代码就是给调用 JVM 内部方法准备的栈空间存储的是 native 方法之间的调用关系是线程私有的即一个线程对应一个本地方法栈 程序计数器记录当前的线程执行到了哪一个指令每一个线程会有对应的一个程序计数器 虚拟机栈此处就是个 Java程序代码 使用的栈存储的是代码方法之间的调用关系在栈空间内是包含有很多个元素的每个元素表示一个方法也称为一个栈帧且每个栈帧会包含方法的入口地址方法的参数方法的返回地址和局部变量等同时这一块空间内并不是只包含一个虚拟机栈而是包含多个的每一个线程对应一个虚拟机栈此处可以通过 jconsole 来对某一个线程进行查看查看线程里的栈调用关系 栈上的内存空间是跟着方法走的也就是调用一个方法就会创建一个栈帧方法执行结束了栈帧也就销毁了 虽说一个线程对应一个虚拟机栈但实际上一个线程栈上的内容比如局部变量另外一个线程也是可以进行使用的 堆堆是 JVM 中空间最大的区域。new 出来的对象都是存放在堆上的类的成员变量也是存放在堆上的。与虚拟机栈和程序计数器不同的是堆是一个进程对应一个即多个线程共用的 元数据区(方法区)(永久代) 这一块空间主要存储常量池静态成员变量和类对象一个进程对应一个元数据区是多个线程共用的 对于 public final 修饰的话就需要去分析是否被优化成字面值常量如果是的话那么就在元数据区的常量池里如果没被优化且没加 static 就是作为成员变量在堆上加了 static的话就是作为静态变量也是在元数据区里 类对象类对象其实可以理解为对应的 .class里面主要存的就是这个类的名称父类方法和属性这些东西一个类只有一个类对象JVM在加载类的时候就会创建一个这个类的class示例 类的初始化和实例化此处与Spring的Bean对象是相反的先进行初始化在进行实例化 1. 在使用一个对象时JVM会先检查当前的类是否完成初始化(在元数据区中给静态数据分配内存并给类的属性值赋予初始值)如果还没有JVM就需要调用类的构造器来完成初始化 2. 完成初始化之后开始进行实例化在堆中开辟内存空间来存储一些非静态数据 所以说根据上述 JVM 内存区域划分的讲解我们可以得知
局部变量是存放在虚拟机栈上的普通成员变量是存放在堆上的静态成员变量是存放在元数据区上的