java内存结构
了解java的内存结构,能够更好地理解程序的调用,内存结构主要有: 栈、堆、方法区、程序计数器。可以看图。比较简陋,看懂就行
##### 虚拟机栈
虚拟机栈,存放方法中的局部变量、方法的出口和入口等,我们程序从主方法进入会开辟一个栈,里面存放程序的局部变量等等,当主方法又调用另外一个方法时,会重新在栈空间中开辟一块新的栈。。。
当调用一个方法时,叫做入栈,而当方法调用完之后,会出栈,从而开辟的那块栈空间会被销毁。
例如下面这个程序
1 | public class Test { |
当启动程序时,会开辟一块主方法的栈,而当执行到add方法时,会在开辟一块区域。而执行完毕之后会销毁,最后直至程序结束
在栈空间,会出现栈溢出(StackOverflowError),即栈空间被耗尽,会出现异常。当写一个递归程序没有规定出口,就会不停的开辟新栈,最后就会导致栈溢出。
本地方法栈
是java调用native方法所开辟的栈空间。为native所服务。
程序计数器
程序计数器是每个线程私有的,程序计数器保证程序的执行流程,当线程切换时,程序计数器可以保证程序能恢复到正确的执行位置。
堆
堆是整个内存结构中,分配空间最大的一部分,堆空间主要是存放对象实例,几乎所有的对象实例、数组都在堆中分配内存。堆也是垃圾回收的主要区域。当堆内存满了以后,会出现OutOfMemoryError异常。表示堆内存满了。
方法区
方法区,主要是用来存储类的加载信息,静态方法,字符串常量池也属于方法区,方法区好像在元空间中,这个概念一直都很模糊。