JVM五大内存区域介绍

1 篇文章 0 订阅

 

 

1. 程序计数器

程序计数器是线程私有,可以认作是当前线程的行号指示器

所以计数器记录虚拟机字节码指令的地址.如果为native(底层方法),那么计数器为空

这块内存区域是虚拟机规范中唯一没有OutOfMemoyError的区域.

 

2. JAVA栈(虚拟机栈)

栈描述的是Java方法执行的内存模型

每个方法被执行的时候都会创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息.每一个方法被调用的过程就对应一个栈帧在虚拟机中从入栈到出栈的过程.

局部变量表所需要的的内存空间在编译期完成分配,当进入一个方法时,这个方法在栈中需要分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表大小

   Java虚拟机栈可出现两种类型的异常

      1. 线程请求的栈深度大于虚拟机允许的栈深度,将抛出StackOverflowError.

       2. 虚拟机栈空间可以动态扩展,当动态扩展无法申请到足够的空间是,抛出OutOfMemory异常.

3. 本地方法栈

本地方法栈是与虚拟机栈发挥的作用十分相似,区别是虚拟机栈执行的是Java方法(字节码)服务,而本地方法栈则为虚拟机使用到的native方法服务,可能底层调用的是其他语言,

4. 堆

堆是java虚拟机管理内存最大的一块内存区域,因为堆存放的对象是线程共享的,所以多线程的时候需要同步机制.

所有对象实例及数组都要在堆上分配内存,但随着JIT编译器的发展和逃逸分析技术的成熟,这个方法也不是那么绝对,但是大多数情况都是这样的.

JIT编译器(即时编译器):可以把java的字节码,包括需要被解释的指令的程序转换成可以直接发送给处理器的指令程序(有笔记记录)

逃逸分析:通过逃逸分析来决定某些实例或者变量是否要在堆中进行分配,如果开启了逃逸分析,即可将这些变量直接在栈上进行分配,而非堆上进行分配.这些变量的指针可以被全局引用,或者其他线程所引用.

堆是所有线程共享,目的是存放对象实例,同事也是GC所管理的主要区域,因此可成为GC堆,由于现在收集器常使用分代算法,java堆中还可以细分位新生代和老年代.(有笔记记录)

根据虚拟机规范,java堆可以存在物理上不连续的内存空间,内存大小可以设为固定大小,也可以扩展.

 

5. 方法区

方法区和堆一样没事所有线程共享的内存区域,为了区分堆,又被称为非堆.

方法区用于存储已被虚拟机加载的类信息,常量,静态变量,如static修饰的变量加载类的时候被加载到方法区中.老版jdk,方法区也被称为永久代.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值