java内存区域

14 篇文章 0 订阅

运行时数据区

方法区 堆 (由所有线程共享的数据区)
虚拟机栈 本地方法栈 程序计数器 (线程隔离的数据区)

程序计数器 线程私有
是一块较小的内存空间 可以看做是当前线程所执行的字节码的行号指示器
字节码解释器(虚拟机)工作时通过改变计数器的值来选取下一条命令
jvm的多线程是通过线程轮流切换 分配处理器执行时间的方式来实现 在任一时刻一个处理器(或者多核处理器的一个内核)只会执行一条线程中的指令 为了线程切换后能恢复到正确的执行位置 每条线程都有一个独立的程序计数器 且彼此互不影响 独立储存
唯一一个没有规定任何抛出OutOfMemoryError异常情况的区域

java虚拟机栈 线程私有
其生命周期与线程相同
每个方法被执行的时候 虚拟机都会同步创建一个栈帧 用于存储局部变量表 操作数栈 动态链接 方法出口等信息 每个方法被调用到执行完毕对应着一个栈帧在虚拟机栈中的入栈到出栈
栈无法申请到足够内存抛出OutOfMemoryError异常

本地方法栈 线程私有
与虚拟机栈的作用十分相似 区别只有虚拟机栈为虚拟机执行java方法服务(字节码服务) 而本地方法栈是为虚拟机使用到的本地方法服务
( JAVA中有两种方法:JAVA方法和本地方法
JAVA方法是由JAVA编写的,编译成字节码,存储在class文件中
本地方法是由其它语言编写的,编译成和处理器相关的机器代码
本地方法保存在动态链接库中,即.dll(windows系统)文件中,格式是各个平台专有的
JAVA方法是与平台无关的,但是本地方法不是。)
在栈深度溢出或者栈扩展失败时分别抛出OutOfMemoryError异常和StackOverflowError

java堆被所有线程共享
对于java应用程序 java堆是虚拟机所管理的内存最大的一块
唯一目的:存放对象实例 “几乎”所有的对象实例都在这里分配内存(还有栈上分配 标量替换等优化手段)
是垃圾收集器管理的内存区域也被称为“GC堆”
java堆可以处于物理上不连续的内存空间 但是在逻辑上它应被视为连续的 并不要求每个文件都连续存放 但是对于大对象(如数组对象) 出于实现简单 存储高效很可能会要求连续的内存空间
既可以被实现成固定大小的 也可以是扩展的 不过当前主流的java虚拟机都是按照可扩展来实现的
java堆中没有内存完成实例分配 并且堆也无法再扩展时 java虚拟机抛出OutOfMemoryError异常

方法区 线程共享 别名“非堆”
存储已经被虚拟机加载的类型信息 常量 静态变量 即时编译器编译后的代码缓存等数据
和java堆一样不需要连续的内存和可以选择固定大小或者扩展 还可以选择不实现垃圾收集
方法区无法满足新的内存分配需求时抛出OutOfMemoryError异常

内存常量池是方法区的一部分
Class文件中除了有类的版本 字段 方法 接口等描述信息外 还有一项信息是常量池表 存放编译期生成的各种字面量与符号引用 该部分内容在类加载后存放到方法运行时常量池中
《java虚拟机规范》没有对其有任何细节要求 可按自己需求实现该内存区域
相对于Class文件常量池有一个重要特征就是具备动态性 运行期间也可以将新的常量放入池中 如String类的intern()方法
常量池无法再申请内存抛出OutOfMemoryError异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值