JVM

内存模型图

程序计数器(PC)

程序计数器的特点

PC是一小块内存空间,用于记录当前线程执行的字节码指令的地址。如果执行的是本地方法(native),PC里此时显示Undefined

优点:

  • 控制程序执行流程
  • 每个线程都有PC,因此可以记录每个线程当前执行的位置

特点:

  • 随着线程的创建而创建,随着线程的结束而销毁
  • 线程私有
  • PC只是记录字节码指令的地址,因此是内存中唯一不会出现OutOfMemoryError(内存溢出)
  • PC是一小块内存空间

冷知识:PC是内存中唯一不会出现OutOfMemoryError(内存溢出)

java虚拟机栈(java 栈)

Java栈是描述java方法运行过程的内存模型,java虚拟机栈会为每一个即将运行的java方法创建栈帧用于存储该方法的信息。(如:局部变量表)
特点:

  • Java栈通常会遇到两个异常,StackOverFlowErrorOutOfMemoryError
    • StackOverFlowErrorjava虚拟机不允许Java栈动态扩展,当线程请求栈的深度超过了Java栈的最大深度时,就会抛StackOverFlowError
    • OutOfMemoryError 允许动态扩展,但可使用内存用完无法动态扩展时,抛OutOfMemoryError
  • Java栈也是随线程创建而创建,随线程销毁而销毁(线程私有)

冷知识: StackOverFlowError可能还有很多内存

本地方法栈(C栈)

本地方法栈是描述本地方法运行过程的内存模型,因为本地方法(native)通常使用c语言,因此本地方法栈也叫C栈。
本地方法栈结构和Java差不多,也会创建栈帧。但当JVM不支持native方法本地方法栈可以不被创建,否则随线程创建和销毁。

堆是用于存放对象的内存空间

特点:

  • 堆空间可以是不联系的内存空间
  • 堆是垃圾回收的主要场所,可以分为新生代(Eden)、老年代
  • JVM中只有一个,所有线程共享一个堆空间里的对象,因此需要注意多线程下的并发问题
  • 堆在JVM创建的时候被创建

堆可以动态扩展,但无多余内存扩展时会抛OutOfMemoryError

方法区

所有的字段和字节码还有一些特殊方法(构造方法、接口)都在此定义。简单说,说有定义方法和信息都存储在此区域,此区域属于共享区间(静态变量,常量,类信息(构造方法,接口的定义),运行时常量池)

原文地址:https://www.cnblogs.com/amberbar/p/11641633.html