JVM-内存结构

195 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

该篇文章先介绍程序计数器+虚拟机栈

谈谈你对JVM的理解

  1. Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码可以由多种语言编译而成。
  2. Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。

JVM是运行在操作系统之上的,它与硬件没有直接的交互

JVM概念图


程序计数器

程序计数器的作用是什么

  • 任何时间一个线程都只有一个方法在执行,而PC用于记录JVM中下一条所要执行的JAVA方法的指令地址

  • CPU会为每个线程分配时间片,当前线程的时间片使用完以后,CPU就会去执行另一个线程中的代码。而程序计数器是每个线程所私有的,当另一个线程的时间片用完,又返回来执行当前线程的代码时,通过程序计数器可以知道应该执行哪一句指令

虚拟机栈

定义

  • 每个线程运行,jvm都会为其分配内存空间,称为虚拟机栈
  • 每个栈由多个栈帧组成(栈帧里面包含各种参数、局部变量、返回地址),每个栈帧对应着每次方法调用时所占用的内存
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的方法(也是栈顶部的栈帧)

栈只有进栈入栈的功能,并不会发生GC

栈中可能发生的异常?

  • stackoverflow:如果采用固定大小的虚拟机栈,那每一个线程可以在创建时指定所分配的栈大小,当线程请求内存过大时,报stackoverflow错误
  • OutofMemoryError:如果采用动态分配栈大小的模式,在尝试扩展但无法申请足够内存时,或者创建新的线程没有足够内存去创建对应虚拟机栈时,报OutofMemoryError错误