jvm

1.JVM

JVM是整个java平台的基石,是java语言编译代码的运行平台。

我们先来看看JVM的结构(面试必问:JVM内存模型)

可以看出JVM结构包含运行时数据区,执行引擎,本地方法库,本地方法接口组成。其中类加载子系统并不属于JVM虚拟机的内部结构。

image.png

2.运行时数据区域

也就是面试常问的JVM内存模型,主要分为程序计数器,栈,堆,方法区和本地方法区。

1)程序计数器:

为保证程序能够连续的执行下去,处理器必须具有某些手段来确定下一条指令的地址。程序计数器就起到了这个作用。程序计数器(Program Counter Register)也叫作PC寄存器,是一块较小的内存空间。在虚拟机概念模型中,字节码解释器的工作就是通过改变程序计数器来选取下一条需要执行的字节码指令。Java虚拟机的多线程是通过轮流切换并分配处理器执行时间的方式来实现的,在一个确定的时刻只有一个处理器执行一条线程中的指令,为了线程在切换后能回复到正确的执行为止,每个线程都会有一个独立的程序计数器。因此,程序计数器是线程私有的。

程序计数器是Java虚拟机规范中唯一没有规定OutOfMemoryError情况的数据区域。

2)Java虚拟机栈:

每一条Java虚拟机线程都有一个线程私有的Java虚拟机栈(Java Virtual Machine Stacks)。它的生命周期与线程相同。Java虚拟机栈储存线程中的Java方法调用的状态,包括局部变量、参数、返回值以及运算的中间结果。一个Java虚拟机栈包括多个栈帧,一个栈帧用来存储局部变量表、操作数栈、动态链接、方法出口等信息。当线程调用一个Java方法的时候,虚拟机压入一个新的栈帧到该线程的Java虚拟机栈中,当该方法执行完成后,这个栈帧就从java虚拟机栈中弹出。

Java虚拟机栈规定了两种异常情况

1:如果线程请求分配的栈容量超过Java虚拟机所允许的最大容量,会抛出StackOverflowError。

2:如果Java虚拟机栈可以动态扩展,但是无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的Java虚拟机栈,则会抛出OutOfMemoryError。

3)本地方法栈

Java虚拟机实现可能需要C Stacks来支持Native语言,这个C Stacks就是本地方法栈(Native Method Stack)。与Java虚拟机栈类似,只不过本地方法栈是用来支持Native方法的。

4)Java堆

Java堆(Java Heap)是被所有线程共享的运行时内存区域。Java堆用来存放对象实例,几乎所有的对象实例都会在这里分配内存。Java堆存储的对象被垃圾收集器管理,这些受管理的对象无法显式的销毁。

5)方法区

方法区(Method Area)是被所有线程共享的运行时内存区域。用来存储已经被Java虚拟机加载的类的结构信息,包括运行时常量池、字段、方法信息、静态变量等数据。方法区是Java堆的逻辑组成部分,它一样在物理上不需要连续,并且可以选择在方法区中不实现垃圾收集。

image.png

你可能感兴趣的:(jvm)