JVM内存模型可分为栈区,堆区,方法区和程序计数器。
栈区可以分为java虚拟机栈和本地方法栈。
1)java虚拟机栈是线程私有的,每个线程创建的时候都会创建相应的虚拟机栈。虚拟机栈生命周期与相关线程是相同的。
2) 每个方法执行都会创建一个栈帧,用于存放局部变量表,操作栈,动态链接,方法出口等。
3) 栈的大小决定了方法调用的可达深度,同时栈的大小可以是固定的也可以是可变的。
4) 如果请求的的深度大于栈的深度,会出现stackOverflowError的错误。如果栈是可扩展的,但没有足够的空间支持扩展,则会出现OutofMemoryError的错误。
本地方法栈和虚拟机栈功能相似,区别在于本地方法栈管理本地用C实现的方法
堆区为所有线程共享的区域
存放所有对象实例和数组。是垃圾回收的主要区域。可以分为新生代和老年代。
新生代用于存放刚创建的对象以及年轻的对象,如果生存时间足够长就会被移入老年代。
方法区被所有线程共享区域,用于存放已被虚拟机加载的类信息,常量,静态变量等数据。也可以叫永久代,一般很少会回收这个区域的数据。只有一个类的定义信息不会被使用时,才会进行回收。
程序计数器在多线程运行时,当线程数超过CPU数量或CPU内核数量,线程之间就要根据时间片轮询抢夺CPU时间资源。因此每个线程都要有一个独立的程序计数器,记录下一条要运行的指令。线程私有的内存区域。如果执行的是JAVA方法,计数器记录正在执行的java字节码地址,如果执行的是native方法,则计数器为空。