Java内存-运行时数据区域

4 篇文章 0 订阅

概述

Java虚拟机将他所管理的内存划分为若干个不同的数据区域。如下图蓝色框以内。
主要有:
1.程序计数器
2.Java虚拟机栈
3.本地方法栈
4.Java堆
5.方法区
6.运行时常量池(是方法区一部分)
7.直接内存
在这里插入图片描述

程序计数器

1.程序计数器是一块较小的内存空间。简单的讲,里面存储的就是当前下一个要执行的指令的位置
2.如果正在执行的是Native方法(java可以调用其他语言的方法,这就是native方法),这个计数器则为空。
3.这个内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域(因为你只会记录运行到那里了)
4.程序计数器是线程私有的。

Java虚拟机栈

1.java虚拟机栈是线程私有的,生命周期与线程相同。
2.Java虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时会创建一个栈帧,用于存储局部变量表,操作数栈,动态连接,方法出口(返回地址)等信息。
3.局部变量表存放了编译期可知道的各种基本数据类型(boolean,byte,char,short,int,float,long,double),对象引用(reference)和返回地址(return Address)类型。
4.局部变量表中以局部变量空间(Slot)为基本单位。64位长的long和double会占用2个slot,其他基本变量占据一个slot。
5.局部变量表所需的内存空间在编译期间完成分配。当进入一个方法时,这个方法需要在帧中分配多大的slot也是完全确定的,运行过程中不会改变局部变量表的大小。
6.在Java虚拟机栈中有两种异常:
a.如果线程请求的栈深度超出所允许的深度,会抛出StackOverflowError。
b.如果虚拟机栈可以动态扩展,并且扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。

在这里插入图片描述

本地方法栈

java虚拟机栈描述的是java方法的内存模型,而本地方法栈描述的是Native方法的内存模型。
其他和java虚拟机栈是差不多的,就不赘述了。

Java堆

1.对大多程序来说,java堆是java虚拟机所管理的内存中最大的一块。
2.Java堆是可以被所有线程共享的一块内存区域(对比:前面三个内存模型都是线程私有的)。
3.唯一目的就是存放实例对象。
4.java堆是垃圾挥手起管理的主要区域。

方法区

1.方法区也是被线程共享的一片区域。
2.存储以及被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。

运行时常量池(方法区一部分)

1.运行时常量池是方法区一部分
2.类加载后,Class文件中的常量池也会进入方法区的运行时常量池。

直接内存(不属于运行时数据区域)

1.直接内存不够时动态拓展也可能导致OOM。
2.NIO引入了基于通道和缓冲的I/O方式,他可以使用Native函数直接分配堆外内存,然后通过一个存储在Java对中的DirectByteBuffer对象作为这块内存的引用进行操作。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值