• Java8-JVM内存区域划分白话解读


    前言

    java作为一款能够自动管理内存的语言,与传统的c/c++语言相比有着自己独特的优势。虽然我们无需去管理内存,但为了防范可能发生的异常,我们需要对java内部数据如何存储有一定了解,已应对突发问题,写出更好的程序

    JVM对运行时程序内存的划分

    java程序在被编译成字节码后,由JVM执行,执行期间产生的所有数据,会被分门别类的存储在JVM预设好的区域里,具体情况如下所示

    以下为java8的内存分布图

    Tips:红色是线程共享的,黄色是线程私有的

    接下来我们着重讨论Java8中的内存分布情况

    JVM管理的内存

    这部分内存在JVM中,由JVM直接分配,初始大小、最大大小都可以由JVM进行配置

    程序计数器

    是一段较小的内存空间,用于告诉字节码解释器下一条执行哪一个字节码指令。是唯一一个在《java虚拟机规范》没有规定任何OutOfMemoryError的区域

    每条线程必须有独立的程序计数器,以确保切换线程时,线程可以在正确的位置继续执行字节码

    Tips:当执行Native方法时,计数器值为空(undefined)


    虚拟机栈

    我们平常俗称的栈指的就是虚拟机栈,用来描述和存储Java方法的内存模型。里面的数据生命周期在编译时就已经确定了,比如局部变量方法调用结束就该释放,内存很容易管理,所以并不是很依赖GC

    具体行为:

    每当执行一个方法时,JVM就会创建一个栈帧放进虚拟机栈中

    栈帧的内容包括但不限于:

    1. 局部变量表(也包括形参)
      • 八大基本数据类型
      • 引用类型(直接指针或者句柄,由具体的JVM实现决定)
      • returnAddress类型 (用于方法结束回到原来的字节码位置继续执行)
    2. 操作数栈
      • 开始时是空的,运行后逐渐入栈出栈,比如算数运算就是操作数栈进行的
    3. 动态连接
    4. 方法出口

    直到方法执行结束,JVM就会将此方法的栈帧出栈

    显然,如果多个线程共用同一虚拟机栈,会出现某个线程的方法还没执行完毕,又被另一线程的栈帧入栈,破坏了方法数据结构。所以虚拟机栈是线程私有的

    returnAddress作用

    用于执行完方法后回到调用方法的位置继续往下执行

    当一个栈帧入栈时,returnAddress保存当前程序计数器的值,即当前字节码位置,然后开始执行方法,方法执行结束后,用returnAddress的值恢复程序计数器,即回到调用方法时的字节码位置


    本地方法栈

    几乎与虚拟机栈一样的作用,其区别是,本地方法栈为本地Native方法服务,通常是本地的C/C++库的方法,而虚拟机栈是为java方法服务的


    堆区

    通常是JVM中最大的内存区域,也是垃圾收集器GC最经常光顾的区域,里面的数据生命周期无法在编译时确定,需要GC来帮助判断是否是“死亡变量”,以回收没必要的内存。

    存储的内容:

    1. 对象的实例
    2. 数组
    3. 字符串常量池
      • 物理上在堆区,逻辑上是方法区的内容
    4. 静态变量
      • 物理上在堆区,逻辑上是方法区的内容

    本地内存

    默认情况使用大小只受限于本地内存的实际大小

    但我们任可以通过JVM配置限制使用大小

    这里面的数据一般不经常变动,存放在这里被JVM间接管理较为合适(间接管理速度肯定比JVM内部的慢些)

    方法区(元空间)

    java8使用元空间来实现的方法区,《Java虚拟机规范》中方法区为堆区的逻辑部分,堆中的对象依靠方法区存储的类信息来生成实例

    存储的内容:

    1. 运行时常量池
      • 字面量
      • 符号引用
    2. 类信息
      • 类型
        • 完整名
        • 修饰符
        • 父类、接口信息
        • 名称
        • 类型
      • 方法
        • 名称
        • 参数
        • 返回值
        • 字节码

    以上包含了一些有代表性的内容,并不代表方法区存储的全部内容


    直接内存

    此部分并不常用,至少对我目前来说。

    小伙伴们有兴趣想了解内容和更多相关学习资料的请点赞收藏+评论转发+关注我,后面会有很多干货。
    我有一些面试题、架构、设计类资料可以说是程序员面试必备!所有资料都整理到网盘了,需要的话欢迎下载!私信我回复【07】即可免费获取

     

    原文出处:www.shaoqun.com/a/1228103.html

  • 相关阅读:
    998. 最大二叉树 II(难度:中等)
    LeetCode_55_跳跃游戏
    黑苹果之微星(MSI)主板BIOS详细设置篇
    编写算法对输入的一个整数,判断它能否被 3,5,7 整除
    看了就会,幼儿园赶快学习这个技术吧
    vue开发网站--对文章详情页的接口内容进行处理
    【小程序】使用font-awesome字体图标的解决文案(图文)
    【无标题】C++库编译
    基于python-CNN的常见鱼类分类识别-含数据集+pyqt界面
    IO学习系列之使用多线程复制同一个文件内容
  • 原文地址:https://blog.csdn.net/wadfdhsajd/article/details/125433422