读《Java虚拟机》之Java内存区域

本文所有内容都是看过 周志明老师 所著《深入理解Java虚拟机》后所写的,可能很多地方理解的不对,希望多多批评指正。

概述

本篇文章将介绍Java虚拟机内存中的各个区域,理解他们的作用,服务对象,以及其中可能产生的问题。

运行时数据区域

Java虚拟机在执行Java代码时会将它所管理的内存划分为若干个不同的区域,每个区域的作用,创建和销毁时间都不一样。具体参考下图:

读《Java虚拟机》之Java内存区域
其中: 绿色部分是所有线程共享区域
           红色部分是线程隔离区域

各个区域的作用如下表所示:

名称 作用 是否线程共享 主要注意事项
程序计数器 记录线程当前执行字节码指令的位置,为空是标识正在执行Native方法
Java虚拟机栈         描述的是Java方法执行的内存模型,每个方法在执行的同时会创建一个栈帧,用于存放局部变量表,操作数栈,动态链表,方法出口信息等。
        每个方法从调用直至调用完成的过程就相当于一个栈帧在虚拟机栈中入栈到出栈的过程。
       局部变量表所需要的内存在编译期就可以完全决定,并且在运行期不会再次发生改变。
深度不足:*eError
宽度不足:OutOfMemoryError
本地方法栈 类似于Java虚拟机栈,区别是Java虚拟机调用的是Java方法(字节码),而本地虚拟机栈则调用的Native方法服务。 深度不足:*eError
宽度不足:OutOfMemoryError
Java堆 存放对象实例,
垃圾收集器的主要管理区域
通过-Xmx -Xms控制大小
当堆中没有内存完成实例分配时,并且堆无法再扩展时,抛出OutMemoryError异常
方法区 存储已被虚拟机加载的类信息,常量,静态变量、即时编译后的代码等数据。 当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常
运行时常量池 方法区的一部分,主要存放编译期生成的各种字面量和符号引用 当常量池无法满足内存分配需求时,将抛出OutOfMemoryError异常