深刻理解jvm内存分区

java运行时数据区域

一、程序计数器
做用:记录程序执行时的位置
        ①内存空间较小
        ②线程私有(java虚拟机的多线程是经过线程轮流切换并分配处理器执行时间的方式实现的),故每个线程都有一个程序计数器,来标识下次执行时的位置
        ③通常java方法指向的是正在执行的虚拟机字节码指令地址,native方法,计数器值为空
        ④java虚拟机规范中惟一一个没有规定任何OutOfMemoryError状况的区域
二、java虚拟机栈
做用:描述java方法执行的内存模型
        ①线程私有,与线程的生命周期相同
        ②栈帧记录着一个方法在虚拟机栈中入栈到出站的过程(栈帧用于存储局部变量表、操做数栈,方法出口等)
        ③若是线程请求的栈深度大于虚拟机所容许的深度,抛StackOverflowError异常,若是支持自动扩容,扩展是没法申请到足够的内存,则抛OutOfMemoryError
三、本地方法栈
做用:服务native方法
        ①与虚拟机栈的区别
虚拟机栈未虚拟机执行java(也就是字节码)服务,而本地方法栈则为虚拟机使用到的native方法服务
        ②异常与虚拟机栈同样
四、java堆
做用:存储对象实例
        ①内存最大的一块
        ②线程共享
        ③在虚拟机启动时建立,惟一目的是存放实例对象,几乎全部对象都在这里分配内存(后面可能会变,不是很绝对)
        ④java堆是垃圾收集器管理的主要区域(GC堆),垃圾回收基本采用分代收集算法
        ⑤线程共享的java堆中可能划分出多个线程私有的分配缓冲区TLAB,可是也是存储的对象实例,这样作是为了更好的分配内存和垃圾回收
        ⑥若是堆中没有内存完成实例分配,且没法扩展时,将报OutOfMemoryError异常
五、方法区
做用:存储已被虚拟机加载的类信息、常量、静态变量等数据。
        ①垃圾回收在这个区域少见,这个区域的回收目标是针对长常量池的回收和对类型的写在
        ②不采用”永久代”的方式,是因为更容易内存溢出
        ③当方法区没法知足内存分配需求是,抛OutOfMemoryErrorjava

相关文章
相关标签/搜索