JVM的内存分配机制


  从图中我们可以看出来,JVM 把java里面的内存区域分为这5个区域,有的时候我们经常看见类似于只把内存分为栈和堆的方式,其实这种方式是比较粗糙的,因为JVM里面的内存模型远比这个要复杂。
    方法区:此区域是线程共享的内存区域,方法区里面存放类的信息,常量,静态变量,即时编译器编译后的代码等数据;运行时常量池是方法区的一部分,class文件中除了有类的版本,字段,方法,接口等描述等信息外,还有一个部分就是常量池,用于存储编译产生的各种字面量和符合引用,这部分内容在类加载后存放到方法区的运行时常量池中。运行时常量池并非只能预装载class文件中的字符变量等信息,它还能动态加载常量。例如,String类里面的 intern()方法。
举个例子:
 String a="d";//1
 String b="d"//2
这里面的符号"d"就是存储在常量池中,当第一句的时候,jvm检测常量池中是否有"d"这个字符,如果没有就加载到常量池中,有的话直接引用常量池中的字符。
   虚拟机栈:又叫方法栈,是线程私有的内存区域,栈的基本元素是栈帧,java里面的方法的调用与结束,都伴随着栈帧的入栈与出栈的过程,栈帧存储着局部变量表,操作帧,动态链接,方法出口等信息。局部变量表存储着8个基本数据类型和对象的引用(对象本身存储在堆中);局部变量表所需的内存空间在在编译期间完成,并且方法运行期间,局部变量表的大小不会改变。
    堆:线程共享的区域,虚拟机启动时创建,此区域存放对象的实例。包括普通的对象,String类型对象,和数组。垃圾回收机制回收的主要区域也是在这里,所以这里也叫做"GC堆";
    程序计数器:程序计数器是内存较小的一块区域,作用是执行当前线程的class文件行号指示器,在汇编里面是保存下条指令的地址。由于这里涉及到保护断点和现场保护,所以每个线程都有自己程序计数器,以免它们之间互相干扰。所以程序计算器是“线程私有”的内存区域。
    本地方法栈:这里执行的是"native"方法,然后程序计数器为空值。上面谈到的几个区域都是运行叫做"Java方法"。
   




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值