美文网首页
JVM 内存模型

JVM 内存模型

作者: 胡子朋 | 来源:发表于2017-12-21 22:09 被阅读0次

    [TOC]
    [图片上传失败...(image-b8ff6a-1513865396951)]

    虚拟机栈

    [图片上传失败...(image-4b9815-1513865396951)]

    1. 每个线程有一个==私有==的栈,随着线程的创建而创建
    2. 每个方法会创建一个栈帧,栈帧中存放了局部变量表(基本数据类型和对象引用)、操作数栈、方法出口等信息
    3. 栈的大小可以固定也可以动态扩展
    4. 以栈帧为单位,进行压栈和出栈

    本地方法栈

    这部分主要与虚拟机用到的 Native 方法相关,一般情况下, 不需要关心这部分的内容

    PC 寄存器

    也叫程序计数器

    1. JVM支持多个线程同时运行,每个线程都有自己的程序计数器
    2. 倘若当前执行的是 JVM 的方法,则该寄存器中保存当前执行指令的地址;倘若执行的是native 方法,则PC寄存器中为空
    3. ==线程私有==,因为多线程并发回来后要恢复到当前线程之前执行的位置,所以每个线程都会独立拥有一个 PC
    4. 占用空间极小

    1. 堆内存是 JVM 所有线程共享的部分,在虚拟机启动的时候就已经创建
    2. 所有的对象和数组都在堆上进行分配
    3. 这部分空间可通过 GC 进行回收。当申请不到空间时会抛出 OutOfMemoryError

    方法区(Method Area)

    特点

    1. ==线程共享==
    2. 又称为 Non-Heap,用来和堆进行区分
    3. 用于存储已被虚拟机加载的==类信息==、==常量==、==静态变量==、即使编译后的代码等数据
    4. HotSpot 虚拟机把 GC 分代收集扩展至方法区,所以在 HotSpot 可以称它为永久代(Permanent Generation)

    方法区的大小的分配

    • -XX:MaxPermSize 最大值,上线
    • -XX:PermSize 最小值
    -XX:MaxPermSize=10M -XX:PermSize=10M
    

    运行时常量池(Runtime Constant Pool)

    用于存放编译期生成的各种字面量和符号引用

    直接内存

    直接内存并不是虚拟机运行时数据区的一部分。
    在NIO中,引入了一种基于通道和缓冲区的I/O方式,它可以使用native函数直接分配堆外内存,然后通过一个存储在java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。
    -XX:MaxDirectMemorySize设置最大值,默认与java堆最大值一样。

    -XX:MaxDirectMemorySize=10M -Xmx20M
    

    相关文章

      网友评论

          本文标题:JVM 内存模型

          本文链接:https://www.haomeiwen.com/subject/saezwxtx.html