JVM虚拟机内存模型
内存模型分为
- 程序计数器
- 虚拟机栈
- 本地方法栈
- 堆
- 方法区
程序计数器
程序计数器是每个线程都有独立的一个东西,而且占用的是私有的内存空间,主要作用是记录着线程要执行的下一条指令。
虚拟机栈
虚拟机栈也是私有的内存空间,并且是跟java线程同一时间创建出来的,在虚拟机栈中,会存在出现两种异常,stackovoverflowError(内存溢出异常)和outofmemoryError(内存泄漏异常)。
首先在这里先讲一个东西,(栈帧结构),在这个结构里面的内容是保存这方法的局部变量表,方法的局部变量,部分结果,参与方法的调用与返回的数据。
还有一个东西要介绍的是虚拟机栈的空间大小是由电脑内存条大小来定的,也可以自己设置程序的虚拟机栈空间大小。
在我们程序运行时,运行到方法的时候,其实在执行进入方法这个操作的时候,栈空间就在执行的操作叫做入栈,当方法return或者结束走到尾部了,栈空间执行的操作叫做出栈,当然,如果入栈的方法占满栈空间后,继续入栈的话就会报溢出异常,就是内存不足;
虚拟机栈,你可以把它想象成一个大盒子,而方法就是小盒子,只不过你做的就是不断放小盒子进去,然后把小盒子拿出来而已,有一点要注意的是你小盒子里面放了有多少东西(局部变量数据),如果你小盒子里面的东西放多了,那么体积肯定比其他小盒子大,盒子大了占的空间自然就多了,那么给其他小盒子的空间自然就少了,就一个内存空间的问题。
本地方法栈
本地方法栈也是调用堆放栈的函数信息,会出现的异常也是内存泄漏和内存溢出
JAVA堆
堆空间的话主要分为两个模块
- 新生代
- 老年代
新生代:里面又分为三个空间
- Eden:对象的出生地
- S0:没有被GC垃圾回收机制回收掉的数据
- S1:没有被GC垃圾回收机制回收掉的数据
老年代:tenured:这块区域存放的是多次被垃圾回收机制收集信息没有被回收掉且还没有过期的数据
方法区
在方法区存放的是类的类型信息,常量池,域信息以及方法的信息,方法区又称永久区,不过虽然是永久区,GC回收机制也能堆其中的常量池,类元空间信息进行回收的,只不过回收的规则与前面的不同罢了。
按照我理解的记录下来,要是有大佬看到了并且注意到了有什么地方是错误的,请麻烦告诉我下,谢谢啦,不过将学到的东西这样写下来确实能够多了些理解