概述:
- 内存是非常重要的资源, 承载着操作系统和应用程序的实时运行。jvm内存布局规定了java在运行过程中内存的申请、分配、管理的策略, 保证jvm的高效运行。
- 还是这个图(一定要记住)
- 元数据区(就是就是jdk1.7的永久代)
- 一个进程拥有一个堆和方法区(jdk1.8:堆外空间或元数据区)
- 一个线程都拥有一份虚拟机栈、程序计数器、本地方法栈(c语言编写的) (共用堆和方法区)
- jdk 1.8
线程
- 分为守护线程和普通线程
- 线程是程序调度和运行的基本单元, jvm支持多线程
- jvm每一个线程根操作系统的线程对应
- jvm中的线程分为
- 虚拟机线程: 执行类型: “stop the world"的垃圾收集、线程收集、线程挂起、偏向锁的撤销
- 周期任务线程 : 周期任务的调度执行
- GC线程 :支持垃圾回收
- 编译线程 : 编译
- 信号调度线程:接受信号并发送给jvm
程序计数器
- 如果学过计组的话肯定知道这个程序计数器的作用他们的作用是一样的, 但是jvm中的程序计数器是物理上的抽象模拟
- 存储用来存储指向下一条指令的地址(利用程序的连续进行)
- 记录的是当前线程执行到什么地方, 任何时间一个线程都只有一个方法在执行,所谓的当前方法, 程序会存储当前线程正在执行jvm方法的指令地址, 如果是native修饰(就是本地方法栈中的方法)的方法, 则是未指定
- 没有GC 、OMM(内存溢出)
- 面试问题
- 使用Pc寄存器存储字节码指令地址有什么用?(为什么使用Pc寄存器记录当前线程的执行地址)
- 学过操作系统的应该知道cpu中执行线程是并发的执行的所以他不断切换当前cpu执行的线程所以
- cpu要知道当前程序方法执行到那一步, 继续从那一步开始, jvm的字节码解释器就需要改变pc的值来明确下一个指令的地址
- PC寄存器为什么会设定为某一个线程私有的
- 在计组中可知寄存器只能存一个值。
- 因为一个线程执行的是自己的方法如果是进程共有的哪就不知道寄存器存的是那个线程的值
- 使用Pc寄存器存储字节码指令地址有什么用?(为什么使用Pc寄存器记录当前线程的执行地址)
总结
本章讲了运行时数据区的构成对几个部分进行了概述, 以及学习pc寄存器的作用。下一章 是运行时数据区的 虚拟机栈 下章较为重要。