虚拟结主要由运行时数据区、执行引擎、类加载器三者构成:java
而咱们所说的JVM内存模型指的就是运行时数据区,下面具体分析一下运行时数据区:缓存
咱们看到运行时数据区能够分为线程共享和线程不共享两部分,其中堆内存和方法区线程共享,本地方法栈、虚拟机栈、程序计数器线程不共享。性能
接下来咱们介绍每个区域的做用:spa
程序计数器(Program Counter Register),也有称做为PC寄存器。想必学过汇编语言的朋友对程序计数器这个概念并不陌生,在汇编语言中,程序计数器是指CPU中的寄存器,它保存的是程序当前执行的指令的地址(也能够说保存下一条指令的所在存储单元的地址),当CPU须要执行指令时,须要从程序计数器中获得当前须要执行的指令所在存储单元的地址,而后根据获得的地址获取到指令,在获得指令以后,程序计数器便自动加1或者根据转移指针获得下一条指令的地址,如此循环,直至执行完全部的指令。线程
虚拟机栈也叫java栈,栈中存储的是帧栈,每个方法对应一个帧栈,方法执行完毕后进行弹栈,让出栈内存,帧栈中存储着方法中定义的变量,若是是基本数据类型,就在栈中进行值的存储,若是是引用数据类型,存储的是引用指向对象的地址。翻译
虚拟机栈也叫栈内存,是在线程建立时建立,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来讲不存在垃圾回收问题,只要线程一结束,该栈就 Over,因此不存在垃圾回收。也有一些资料翻译成JAVA方法栈,大概是由于它所描述的是java方法执行的内存模型,每一个方法执行的同时建立帧栈(Strack Frame)用于存储局部变量表(包含了对应的方法参数和局部变量),操做栈(Operand Stack,记录出栈、入栈的操做),动态连接、方法出口等信息,每一个方法被调用直到执行完毕的过程,对应这帧栈在虚拟机栈的入栈和出栈的过程。3d
局部变量表存放了编译期可知的各类基本数据类型(boolean、byte、char、short、int、float、long、double)、对象的引用(reference类型,不等同于对象自己,根据不一样的虚拟机实现,多是一个指向对象起始地址的引用指针,也多是一个表明对象的句柄或者其余与对象相关的位置)和 returnAdress类型(指向下一条字节码指令的地址)。局部变量表所需的内存空间在编译期间完成分配,在方法在运行以前,该局部变量表所须要的内存空间是固定的,运行期间也不会改变。指针
和虚拟机栈功能类似,不过本地方法栈存储针对本地方法。code
堆内存主要用来存储被建立的对象,一个类new出一个对象,会在堆中开辟内存空间,并在栈中存储一个引用,存储着对象在堆中的地址。堆内存中的对象存储着本身的成员变量,并不保存对象的方法,方法被保存在帧栈中,堆内存也称为gc堆,是主要用来进行垃圾回收的内存。对象
方法区是一个很是重要的区域,也是被线程共享的区域,方法区存储了每一个类的信息(类的名称、方法信息、字段信息),静态变量、常量以及编译后的代码等。
方法区还包括一个常量池,用来存储编译期间生成的字面量和符号引用。这部份内容在类被加载后,都会存储到方法区中的RCP。值得注意的是,运行时产生的新常量也能够被放入常量池中,好比 String 类中的 intern() 方法产生的常量。
常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其余类型、方法、字段的符号引用.
常量是指被final修饰的变量,值一旦肯定就没法改变。
final能够修饰静态变量、实例变量和局部变量。
咱们知道方法区中存放着class文件的信息,还包括用来存储class常量的常量池,方法区中还存在运行时常量池二者什么关系?
常量池主要用来存放两大类常量:字面量和符号引用量,字面量至关于Java语言的常量,如文本字符串,声明为final的常量等,符号引用包括如下三种
类和接口的全限定名
字段名称和描述符
方法名称和描述符
class文件中的常量池中的内容会在类加载后进入方法区的运行时常量池。相对于常量池,运行时常量池的重要特征是具备动态性,java并不要求常量只有在编译器才会产生,运行期间也能够将新的常量存放入池中,这种特性用的最多的String类中的intern()方法。
常量池是为了不频繁的建立和销毁对象形成系统性能的浪费,实现了对象的共享。
==号比较基本数据类型,就是比值,比较引用数据类型比较的是内存中存放的地址。
对于byte、short、long、char、boolean对应的包装器类都有对应的常量池,这五种包装器类默认建立在-128到127的对象会存放在在缓存中。
对于两种浮点数没有实现常量池技术。
String str1="abc"; String str2=new String("abc"); System.out.println(str1==str2);
结果为false;