自我记录 自我记录。。。
JVM内存模型图:
线程私有的有:程序计数器、虚拟机栈、本地方法栈
线程共享的有:堆、方法区
下面的分个说。。
程序计数器:相当于一个指挥官,指挥程序应该怎么执行,保存的是需要执行的指令的地址,这个指挥官只能指挥非Native方法,当方法是native时,那么他就不能指挥方法去哪里了,因为指挥官里只保存了undefined
虚拟机栈:这个里面包含的东西有点多,它是方法执行时候的模型,回想一下,在方法里面包含了哪些东西?
简单举个例子,下面这个方法
public class Add {
private static int result = 0;
public static int add(int a) {
int b = 1;
result = a + b;
return result;
}
}
这里包含了局部变量b,一个操作a + b,返回了一个数result,引用了一个运行时常量池中的变量result
局部变量、操作数栈、方法返回地址、对运行时常量池的引用
方法的执行过程:当线程调用某个方法First()时,虚拟机会为该方法创建一个栈帧,压入虚拟机栈中,如果在该方法中又调用了某个方法Second(),那么再创建一个栈帧,再压入虚拟机栈,位于First()上,程序当前执行的方法位于栈顶,因此,当方式是递归调用时,容易造成栈溢出异常。
本地方法栈:这个没啥说的,跟虚拟机栈类似,区别是对象不一样,虚拟机栈针对的是非native方法,而本地方法栈对应的是native方法
堆:当你在程序中进行new这个操作时,比如A a = new A();,那么这个对象生成之后就放在了堆里。
方法区:这个也是个相对比较麻烦的区域,方法区又被叫做那静态区(永久代PermGen),也被叫做非堆,这个里面包含了所有的class以及static变量(类的信息、常量池、方法数据、方法代码),包含的整个方法中都唯一存在的元素,唯一存在!!这个里面容量超了的话,会报这个错误:java.lang.OutOfMemoryError: PermGen space