自动内存管理机制(一) Java内存区域

虚拟机

虚拟机是计算机系统的模拟,基于计算机架构,提供物理计算机的功能

Java虚拟机

将Java或者其他语言编写的程序编译为Java字节码,并能让程序在计算机上运行的虚拟机

运行时数据区域


1) 程序计数器

当前线程所执行的字节码的行号指示器

特征:

    > 字节码解释器根据程序计数器确定下一条需要执行的字节码指令

    > 线程执行Java方法,计数器记录虚拟机字节码指令的地址

扫描二维码关注公众号,回复: 1796361 查看本文章

    > 线程执行Native方法,计数器为空(Undefined)

    > JVM中唯一没有规定OutOfMemoryError的区域

2) Java虚拟机栈

描述Java方法执行的线程模型,方法执行时都会创建一个栈帧

特征:

    > 栈帧用来存储局部变量表,操作数栈,动态链接,方法出口等信息,方法执行过程,对应着一个栈帧在虚拟机栈中入栈到出栈的过程

    > 局部变量表所需空间在编译期间完成分配,进入方法时,方法需要在帧中分配多少局部变量空间是完全确定的,运行期间不会改变局部变量表的大小

局部变量表:

    > 基本数据类型,1个局部变量空间,除了long和double2个局部变量空间

    > 对象引用,并非对象本身,1个局部变量空间

    > returnAddress类型:字节码指令的地址,1个局部变量空间

异常:

    > StackOverflowError:线程请求栈深度大于虚拟机允许的深度

    > OutOfMemoryError:虚拟机栈动态扩展是无法申请到足够的内存

3) 本地方法栈

本地方法栈为虚拟机使用的Native方法服务

异常:

    > StackOverflowError

    > OutOfMemoryError

4) Java堆

虚拟机启动时创建所有线程共享的内存区域

特征:

    > 存放对象实例

    > 垃圾收集器管理的主要区域(有时称为GC堆)

    > Java堆可以处于物理上不连续的内存空间中,逻辑上是连续的

异常:

    > OutOfMemoryError

5) 方法区

存储被虚拟机加载的类信息,常量,静态变量,JIT编译器编译后的代码等

特征:

    > 内存回收目标是针对常量池的回收和类型的卸载

    >运行时常量池: 

        > Class文件在编译期生成的各种字面量和符号引用的文件常量池,加载入方法区,形成运行时常量池

        > 动态性:并非一定是要Class文件常量池加载到方法区,在运行期间也可能有新的常量放入池中,如String的intern()

异常:

    > OutOfMemoryError



直接内存

不是虚拟机运行时数据区的一部分,但经常被使用,NIO使用Native函数库直接分配堆外内存,通过Java堆中的DirectByteBuffer对象引用直接内存进行操作,显著提高性能,避免Java堆和Native堆中复制数据

异常:

    > OutOfMemoryError


猜你喜欢

转载自blog.csdn.net/weixin_42129080/article/details/80854980
今日推荐