java运行时内存模型
运行时内存分为:
1、方法区
2、堆
3、虚拟机栈
4、本地方法栈
5、程序计数器
方法区、堆是共享的,所有线程都可以读取
虚拟机栈、本地方法栈、程序计数器是线程私有的,每个线程单独一套,它们在线程创建时生成,在线程死亡时销毁
堆分为年轻代,老年代,永久代。分区的目的是为了更快的分配内存和更好的执行垃圾回收。主要作用是存户对象实例,绝大部分实例和数据都存储在堆中,gc就作用于堆
hotspot虚拟机的方法区存储在永久区,方法区的实现jvm规范没有强制规定,hotspot虚拟机这么实现完全是为了懒省事,方法区放到永久代后gc也可以管理方法区,不用单独实现垃圾回收。
1.8之后hotspot虚拟机移除了整个永久区,改用直接使用物理内存的元空间替代永久代。
程序计数器是唯一不会出现oom的区域,虚拟机实现程序的跳转,循环等操作是基于程序计数器的,程序计数器就是指令的行号,虚拟机通过计数器知道下一个应该执行的指令是哪个。
当线程创建的时候会在栈内存中为线程的每个方法创建一个栈帧,该栈帧中保存着每个方法的局部变量表,方法的出口,动态链接,操作数栈等信息。当前栈帧指的是当前正在执行的线程的方法。
本地方法栈存储的是被执行的本地方法(也就是native方法)的栈帧,存储的内容和线程方法的栈帧存储的内容类似。