程序计数器可以看作当前线程执行的字节码的行号指示器,且每个线程都有自己独立的程序计数器。此区域没有规定内存溢出的情况,因为我们开发人员不会操作到此区域。
虚拟机栈(先进后出)为虚拟机执行Java方法服务,存放栈帧(每个栈帧对应一个方法)。
每个方法执行都会创建栈帧,栈帧中包含局部变量表、返回值地址等信息。栈帧创建好,方法开始执行,待方法执行完 毕,栈帧出栈,随后就会被销毁。举例:若A方法中调用了B方法,创建A的栈帧,进入栈,开始执行A方法,执行到A调用B的时候,创建B的栈帧,进入栈,开始执行B方法,B方法执行完毕后,B的栈帧出栈,随后被销毁。A方法继续执行余下部分,直至执行完毕,A的栈帧出栈,随后被销毁。
在使用递归的时候,如果处理不好临界值,很容易就会出现栈内存溢出问题(StackOverFlow)
本地方法栈为虚拟机执行native方法服务(Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:定义被native关键字修饰的接口,该接口的实现由非java语言实现),其他与虚拟机栈完全一致。
堆用于存放对象的实例,是垃圾回收器的主要工作区域,分为新生代和老年代,新生代中又划分Eden区,Survivor1区和Survivor2区,当堆内存不足的时候,就会抛出OutOfMemory异常,我们可以通过-Xms和-Xmx来指定堆内存空间。
方法区存储虚拟机加载的类的信息(字段,方法,接口),常量,静态变量以及编译器编译之后的代码。当方法区内存不足的时候,就会抛出OutOfMemory异常。方法区很重要的一部分就是运行时常量池,在类和方法被加载到JVM中,对应的运行时常量池就被创建出来,并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。
下一篇链接:https://blog.csdn.net/Peacock__/article/details/88718589