java虚拟机-运行时数据区域

1.程序计数器:
一块较小的内存空间,可以看作当前线程执行的行号指示器。通过程序计数器来选取下一条需要执行的字节码指令,分支,循环,跳转等都通过程序计数器完成。是线程私有的,每一个线程拥有自己的程序计数器。是内存区域唯一一个不存在内存溢出的。
2.java虚拟机栈:
线程私有的。是描述java方法执行的内存模型,每个方法执行时都会创建一个栈帧用于存储局部变量,操作数栈,动态链接,方法出口等信息。局部变量表用于存放编译器可知的各种数据类型(boolean,byte,char,int,float,double,对象引用reference),局部变量表所需内存空间是在编译期间完成分配的,随后不会更改空间大小。当请求的栈深度大于虚拟机所允许的深度,将抛出stackOverflowError异常;如果虚拟机可以动态扩展,如果无法再申请足够的内存,就会抛出OutOfMemoryError.
3.本地方法栈:
跟java虚拟栈相似。为本地native方法服务,java虚拟机栈为java方法服务,同样会抛出StackOverflowError和OutOfMemoryError异常。
4.java堆:
虚拟机所管理内存中最大的一块。java堆是被所有线程共享的一块内存区域。大部分对象实例以及数组都在堆上分配,栈上分配,标量替换技术。
从内存回收角度看,现在的收集器都采用分代回收,堆上分为:新生代(Young Generation)和老年代(Old Generation);其中新生代又分为Eden空间,From Survivor,To survivor;从内存分配角度来看,线程共享的java堆可以划出多个线程私有的分配缓冲区。
java堆可以在物理上不连续的内存空间,但逻辑上是连续的就可以。但堆上的没有内存完成实例分配,并且无法扩展就会抛出OutOfMemoryError.
新创建的对象实例都是在新生代的Eden空间完成内存分配,当Eden空间满时进行一次
GC,将还被使用的对象服务到From survivor,这样Eden空间都是未被使用的空间,可供继续创建对象,当Eden空间再次用完时,触发一次Young GC,将Eden区和From区还在被使用的对象复制到To区。下一次Young GC时将Eden区和To区中还在被使用的对象复制到From区。所以经过多次Young GC,某些对象会在From区和To区多次复制,如果超过某个值对象还未被释放,将该对象复制到Old Generation.如果Old Generation空间也使用完,那么就会触发Full GC.
5.方法区:
用户存放被虚拟机加在的类信息,常量,静态变量等编译后的代码等数据。
6.运行常量池:
存放编译期生成的各种字面量和符号引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值