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见其他章节)相关文章推荐
- Java 6 JVM参数选项大全(中文版)
- Linux 定位某个jvm进程占用CPU最高的线程
- XHTML标准的版本
- 深入解析JVM对dll文件和对类的装载过程
- JVM之参数分配(全面讲解)
- 在java代码中获取JVM参数的方法
- JVM Tomcat性能实战(推荐)
- JVM垃圾收集器详解
- Java虚拟机JVM性能优化(二):编译器
- Java程序员必须知道的5个JVM命令行标志
- 学习JVM之java内存区域与异常
- JVM 体系结构详解
- JVM 参数配置详细介绍
- JVM加载一个类的过程
- 浅谈jvm中的垃圾回收策略
- JVM 方法调用之动态分派(详解)
- jvm crash的崩溃日志详细分析及注意点
- JVM 方法调用之静态分派(详解)
- java jvm的知识详细介绍
- Java虚拟机JVM性能优化(三):垃圾收集详解