概述
在学习java或者面试过程中经常会碰到JVM内存模型的问题,在学习的过程中整理了下JVM的一些基本概念,本篇主要总结以下几部分:
1.常见的JVM实现有那些。
2.java从编码到执行中那部分是JVM。
3.JVM规范的内存模型。
常见的JVM实现有那些
java虚拟机是一个规范,他定义了java虚拟机能执行什么,java虚拟机应改有那些模块,遇到什么指令执行什么操作等 具体规范可以到官网看:https://docs.oracle.com/en/java/javase/13/
常见的JVM实现
1.Hotsport : oracle官网的JVM实现。
2.jrockit: BEA,曾经号称世界上最快的JVM,被oracle收购,合并于hotspot,
3.TaobaoVM:hotspot深度定制版
4.LiquidVM : 直接针对硬件
5.azul zing 最新垃圾回收的业界标杆,www.azul.com.
java从编码到执行
在写java代码的过程中,代码从编码到执行过程中,如下步骤中的3.4.5是属于JVM里,具体如下:
1.首先我们编写.java的代码文件。
2.通过javac执行将.java文件变成.class文件。
3.通过classloader把class文件加载到内存中,同时会吧java的类库也装载到内存里。
4.加载完成后会调用字节码解释器或者JIT即时编译器进行编译。
5.编译完的代码会交给执行引擎去执行。
6.执行引擎下边对应的是硬件和操作系统了。
JVM规范的内存模型
jvm规范中将JVM内存划分成5部分,其中方法区和堆是所有线程共享的区域,虚拟机栈、本地方法栈、程序计数器三部分是线程私有的,具体描述如下:
1)方法区:存放的是虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等,在hotspot虚拟机实现中,在JDK1.8之前叫perm space(永久区),1.8及之后版本叫Meta space(元数据区),实现上的区别是,永久区是用的jvm内存,元数据是用的操作系统内存不占用JVM的内存。
2)堆:虚拟机启动时创建,此内存区域主要存放对象实例,几乎所有的对象都是在这里分配内存,当堆内存不足是会抛出OutOfMemoryError。
3) 虚拟机栈:每个线程私有的运行时堆栈,每个方法会创建一个栈帧,所有局部变量会存放在栈帧中。其中栈帧里包含:局部变量、操作数栈、动态链接(指到我们常量池里边的引用)、return地址四部分,栈空间用光了会报StackOverFlowError。
4)本地方法栈:与虚拟机栈所发挥的作用相似,区别只是虚拟机栈为虚拟机执行java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务
5)程序计数器:存放的是当前线程正在执行的字节码指令地址,如果是native方法,则保存的值是undefine