JVM原理 | JVM内存模型

JVM内存模型

1. 概述

  1. 程序计数器 : 如果线程执行的是个java方法,那么计数器记录虚拟机字节码指令的地址。如果为native【底层方法】,那么计数器为空。这块内存区域是虚拟机规范中唯一没有OutOfMemoryError的区域

  2. 虚拟机栈: java方法的执行和结束对应着栈帧的入栈和出栈,

    • 栈帧 : 用于存储局部变量表,操作栈,动态链接,方法出口等信息

    • 局部变量表所需要的内存空间在编译期完成分配,当进入一个方法时,这个方法在栈中需要分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表大小。

    • Java虚拟机栈可能出现两种类型的异常:

      1. 线程请求的栈深度大于虚拟机允许的栈深度,将抛出StackOverflowError。
      2. 虚拟机栈空间可以动态扩展,当动态扩展是无法申请到足够的空间时,抛出OutOfMemory异常。
  3. 本地方法栈 : 本地方法栈是与虚拟机栈发挥的作用十分相似, 区别是虚拟机栈执行的是Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的native方法服务,可能底层调用的c或者c++, 我们打开jdk安装目录可以看到也有很多用c编写的文件,可能就是native方法所调用的c代码。

  4. : 对于大多数应用来说,堆是java虚拟机管理内存最大的一块内存区域,因为堆存放的对象是线程共享的,所以多线程的时候也需要同步机制。因此需要重点了解下。

    实例在堆中( 也就是new的对象 )

  5. 方法区: 保存在着被加载过的每一个类的信息;static变量信息也保存在方法区中;
    可以看做是将类(Class)的元数据,保存在方法区里;

    方法区是线程共享的;当有多个线程都用到一个类的时候,而这个类还未被加载,则应该只有一个线程去加载类,让其他线程等待;
    方法区的大小不必是固定的,jvm可以根据应用的需要动态调整。

img

2. 内存溢出和内存泄漏是什么

简述一下:

溢出: 所需要用的内存大于系统给的内存

泄漏: 某对象不用了但是没被回收

猜你喜欢

转载自blog.csdn.net/weixin_40597409/article/details/115243862