jvm学习笔记
自动内存管理
运行时数据区
运行时数据区主要包括虚拟机栈、本地方法栈、程序计数器、方法区、堆等,其中方法区和堆属于线程共享内存区域;虚拟机栈和本地方法栈属于线程隔离的数据区
程序计数器
占用内存空间较小,可以当作是当前线程执行的字节码行号指示器。jvm的多线程是通过线程切换并分配一定处理时间的方式来实现的,所以多个线程在运行时候,当前线程退出cpu时,必须有个东西记住当前线程执行的java方法的虚拟机字节码指令的地址。如果当前正在执行的方法是本地方法(native),计数器值为空。程序计数器不会导致oom
java虚拟机栈
java虚拟机栈也是属于线程私有的一块内存区域。生命周期和线程相同;java虚拟机栈描述的时java方法执行时候的内存模型:每个方法的运行时候会创建一个栈帧,用处储存局部变量表、操作数栈、方法出口、动态链接等信息。每个方法的调用到执行完毕,对应的就是这个栈帧的入栈到出栈的过程;
局部变量表:用于储存对象的引用(可能是对象在堆中的内存地址,也可能是一个该对象的句柄的地址,编译期可知的各种基本数据类型,其中long和double各占两个字节,别的都时一个字节。局部变量表在栈帧中的空间大小是进入方法时候就已经完全确定了,而且中间不会改变。
操作数栈: 一个方法的调用执行其实就是方法调用时创建一个栈帧,然后再栈帧内部会根据类的信息获取指令,从局部变量表中取数据,进行操作数栈的入栈出栈方式执行指令。
java堆
java堆是虚拟机管理的最大的一块内存区域,在虚拟机启动的时候分配空间;java堆存在的主要作用是存放对象实例;他也是垃圾收集器主要管理的一块内存区域;从垃圾回收的角度来看,可以将java堆分为新生代和老年代,细一点可以分为eden区,to Survivor区,from Survivor区等。从内存分配的角度,java堆可能划分出来多个线程私有的内存分配缓冲区( Thread Local Allocation Buffer)简称TLAB;我们系统运行中出现的oom最多就是出现在java堆中。