初步认识JVM虚拟机的内存结构~【附知识图谱】

JVM可以分为两大类:私有区和共享区;
私有区又分为三部分:程序计数器,虚拟机栈,本地方法栈;
共享区又分为两个部分:堆,方法区;
私有区不需要垃圾回收器的参与,出栈后JVM自动就释放掉内存,共享区需要垃圾回收器GC参与。
程序计数器是用来保存每个线程执行到字节码的哪一行的,内存大小固定,不存在OOM内存溢出问题。
虚拟机栈是用来保存栈帧的,每个方法要被执行前都会将局部变量存入栈帧,执行时入栈,执行完毕出栈。还有我们平常抛出的栈溢出就是指的虚拟机栈,比如方法死循环递归调用,很多栈帧都需要存入虚拟机栈,但是超过栈帧数量限制就会抛出栈溢出异常。
虚拟机栈是每个线程私有的,当太多线程申请虚拟机栈内存但是JVM提供不了这么多的时候,就会报虚拟机栈内存溢出。
本地方法栈和虚拟机栈作用是一样的,不同点就是入栈的是被native修饰的方法(本质是由C/C++ 编写的方法)。
堆:所有线程创建的对象实例、数组都保存在堆里,是最容易发生OOM的地方,堆又被分为新生代和老年代,新生代就是用于保存新建的对象的堆,先保存在Eden堆,根据存活时间依次移动到S0和S1堆,老年代就是用于保存多次GC都没被回收的对象。
方法区:保存的是静态变量、类的元数据、常量。

image

posted @ 2026-03-19 15:18  Jwwind  阅读(4)  评论(0)    收藏  举报