堆
所有的对象都在堆里面进行分配
堆是java虚拟机所管理内存中最大的一块
起始:在虚拟机启动时创建,被所有线程共享
java对象实例以及数组都在堆上分配
当堆无法满足内存分配需求时,将抛出OutOfMemoryError
方法区
方法区是各个线程共享的内存区域,在虚拟机启动时创建
存储内容:被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
方法区记录的是方法以外的一些数据
虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的是和java堆区分开来
异常产生:方法区无法满足内存分配需求时,抛出OutOfMemoryError异常
jdk的版本区分
jdk8:Metaspace【元空间】
jdk6或7中就是Perm Space【永久代】
Run-Time Constant Pool 在方法区分配
java虚拟机栈
是什么?
虚拟机栈是一个线程执行的区域,保存着线程中方法的调用状态。
一个java线程的运行状态,由一个虚拟机栈来保存
虚拟机栈肯定是线程私有,独有的,随着线程的创建而创建
栈帧
每个线程执行的方法,为该栈的栈帧,即每个方法的执行对应一个栈帧
细节
每个栈帧对应一个被调用的方法,可以理解为一个方法的运行空间
调用一个方法,就会向栈中压入一个栈帧;一个方法调用完成,就会把该栈帧从栈中弹出
程序计数器
当前线程所执行方法的位置,在虚拟机栈中 The PC register<br>
一个jvm进程中有多个线程在执行,而线程中的内容是否能够拥有执行权,是根据cpu调度来的。<br>假如线程A正在执行到某个地方,突然失去了CPU的执行权,切换到了线程B了,然后当xianchengA再获得Cpu执行权的时候,怎么能继续执行呢?这就是需要在线程中维护一个变量,记录线程执行到的位置
程序计数器的说明
1、程序计数器占用的内存空间很小,由于java虚拟机的多线程是通过线程轮换切换,并分配处理器执行时间来实现的,任意时刻,一个处理器只会执行一个独立的程序计数器(线程私有)
2、如果线程正在执行Java方法,则计数器记录的是正在执行的虚拟机字节码指令的地址
3、如果正在执行的是Navicat方法,则这个计数器为空
线程私有