JVM运行内存模型

自我记录  自我记录。。。

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 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值