您的位置:首页 > 其它

JVM运行时内存布局

2017-11-02 00:08 106 查看

1.JVM运行时内存布局如下:

                     


    其中红色背景图为线程共享区,绿色背景图为线程私有区。

1.1 程序计数器

    可以看做是当前线程执行的字节码(class)文件的行号指示器,字节码解释器就是通过改变计数器中的值来选取下一条执行的字节码指令,如循环、分支、跳转、异常等。单个处理器在某个时刻只能执行一个线程的指令,在切换到其他线程执行时需要计数器来记录操作轨迹,因此计数器是线程私有的。计数器在JVM规范中唯一一个没有规定OOM情况的区域。

1.2 方法区

    在HotSpot虚拟机中该区域被称为永久代(Permanent Generation), 它主要存放类(包括类名、修饰符、字段、方法)信息、常量池(JDK1.7之后已从方法区中移出)、static变量。JVM会回收废弃的字面量和无效的类。

1.3 JVM栈

    每个方法在执行的同时会在JVM栈中创建一个栈帧(Stack Frame), 里面存储了局部变量表、操作数栈、动态链接、方法出口等信息,方法从调用到完成的过程就对应一个栈帧在JVM栈中的入栈到出栈的过程。其中局部变量表存放基本数据类型、对象引用、返回地址类型等信息。

1.4 本地方法栈

    为JVM执行Native Method服务,功能和JVM栈类似,在HotSpot中二者合为一体。

1.5 堆

    我们日常new对象和数据存放的区域,也是垃圾回收器工作的主要区域。内存在物理上是不连续的,在逻辑上是连续的,类似我们的磁盘。

1.6 常量池

    常量池分为两种形态:静态常量池和运行时常量池,静态常量池指.class文件中的常量池,不仅包括字符常量池,还包括类、方法信息。运行时常量池时JVM在类加载器将类加载完后,把.class文件的常量池载入到内存中,运行过程中支持动态添加数据到常量池中

1.7 直接内存

    直接在Native堆申请内存,不属于堆内存,IO操作时减少了直接内存和堆内存的交互,DirectBuffer和ByteBuffer相比创建和销毁更消耗性能,但读写性能更高。(其他相关名词如DMA、ZeroCopy见其他章节)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息