0
点赞
收藏
分享

微信扫一扫

JVM 运行时数据区域

分湖芝蘭 2022-03-25 阅读 60

运行时数据区域

Java虚拟机在执行就Java程序的时候会把它所管理的内存分为多个区域,有些区域随着Java虚拟机进程启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立销毁。根据《Java虚拟机规范》,Java虚拟机管理的运行时区域如下图:
在这里插入图片描述

一.程序计数器

  1. 线程私有内存
  2. 是当前线程所执行的字节码的行号指示器
  3. 执行Java方法,计数器记录的是正在执行虚拟机字节码指令地址
  4. 执行本地方法,计数器的值则为空(Undefined)
  5. 唯一一个没有规定任何OOM的区域

二.虚拟机栈

  1. 线程私有
  2. 随着线程的启动而创建,线程的销毁而销毁
  3. 每个方法执行的时候都会创建一个自己的栈帧;栈帧中存放的是** 局部变量表、操作数栈、动态链接、方发出口等信息 。**
    • 局部变量表:存放了在编译期可知的Java虚拟机的基本数据类型(byte、boolean、char、short、int、long、float、double),对象引用以及returnAddress类型;

三.本地方方法栈

与虚拟机栈作用相似,不同在与虚拟机栈是执行Java方法,本地方法栈执行的是本地方法(HotSpot虚拟机是将虚拟机栈与本地方法栈合二为一 )。

四. Java堆

  1. 是虚拟机管理的中内存最大的一块;
  2. 所有线程共享,虚拟机启动的时候创建;
  3. 存放对象实例及数组
  4. 是垃圾收集器管理的一个内存区域
  5. 分为新生代以及老年代
     新生代: 包含Eden区、From SurvivorTo Survivor
  6. Java堆可以按照需求来扩展大小
    	可以通过-Xmx :最大堆内存;及-Xms :最小堆内存来设置堆大小
  7. 不连续的内存空间

五. 方法区 也叫Meta-space

  1. 多线程共享
  2. 用于存储已被虚拟机加载的类型信息、常量、静态变量、及时编译器编译后的代码缓存等数据
  3. 一般不会被垃圾回收,垃圾回收器在这个区域主要是针对常量池的回收和对类型的卸载。
举报

相关推荐

0 条评论