文章目录
JVM概念
JVM(Java Virtual Machine的简称。意为Java虚拟机。):
指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。 常见的虚拟机有JVM、VMwave、Virtual Box。.JVM和其他两个虚拟机的区别:
1、VMwave与VirtualBox是通过软件模拟物理CPU的指令集,物理系统中会有很多的寄存器
2、JVM则是通过软件模拟Java字节码的指令集,JVM中只是主要保留了PC寄存器,其他的寄存器都进行了裁剪JVM是一台被定制过的现实当中不存在的计算机
jvm位置
JVM就是一个软件,软件是运行在操作系统之上的,所以JVM的位置就是操作系统之上。
JVM框架:
线程私有区域:程序计数器、Java虚拟机栈、本地方法栈
线程共享区域:Java堆、方法区、运行时常量池
对个部分的的解释
程序计数器(线程私有)
是一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,就是一个指针,指向下一个要运行指令的地址。如果当前线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是一个Native方法,这个计数器值为空。
虚拟机栈(线程私有)
虚拟机栈描述的是Java方法执行的内存模型 : 每个方法执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口(方法返回地址)等信息。每一个方法从调用直至执行完成的过程,就对应一个栈帧在虚拟机栈中入栈和出栈的过程。声明周期与线程相同。
之前我们一直讲的栈区域实际上就是此处的虚拟机栈,再详细一点,是虚拟机栈中的局部变量表部分(存放了编译器可知的各种基本数据类型(8大基本数据类型)、对象引用等)。
本地方法栈(Native Method Stack)(线程私有)
本地方法栈与虚拟机栈的作用完全一样,他俩的区别无非是本地方法栈为虚拟机使用的Native方法服务,而虚拟机栈为JVM执行的Java方法服务。
在HotSpot虚拟机中,本地方法栈与虚拟机栈是同一块内存区域
方法区(Method Area)
在JDK8以前的HotSpot虚拟机中,方法区也被称为"永久代"(JDK8已经被元空间取代)。方法区是被所有线程共享,存放的主要为以下的内容。
静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中,但是实例变量存在堆内存中,和方法区无关(static ,final,Class,常量池)
运行时常量池(方法区的一部分)
运行时常量池是方法区的一部分,存放字面量与符号引用。
字面量 : 字符串(JDK1.7后移动到堆中) 、final常量、基本数据类型的值。
符号引用 : 类和结构的完全限定名、字段的名称和描述符、方法的名称和描述符。
Java堆(线程共享)
Java堆(Java Heap)是JVM所管理的最大内存区域。Java堆是所有线程共享的一块区域,在JVM启动时创建。此内存区域存放的都是对象实例。
Java堆是垃圾回收器管理的主要区域,因此很多时候可以称之为"GC堆"。根据JVM规范规定的内容,Java堆可以处于物理上不连续的内存空间中。Java堆在主流的虚拟机中都是可扩展的(-Xmx设置最大值,-Xms设置最小值)。
如果在堆中没有足够的内存完成实例分配并且堆也无法再拓展时,将会抛出OOM,堆又可分为以下几部分:
一般新创建的对象都在