一、虚拟内存模型
注:图中红色部分为线程共享,白色部分为线程私有
二、Java虚拟机栈
作用域:线程私有,生命周期同线程是一样的
存储数据:每个方法执行时会首先创建栈帧,存储局部变量表、操作数栈、动态链接和方法出口等信息。
其中局部变量表存储了基础数据类型(int、boolean、char、byte、long、short、float、double)和对象引用
异常类型:请求栈深度超过虚拟机允许的栈深度---StackOverflowError;动态扩展栈内存时,无法申请到足
够内存-----OutOfMemoryError
三、本地方法栈
作用域:执行的是本地Native方法所需要保存的信息,线程私有的区域
异常类型:同虚拟机栈一样,也会抛出StackOverflowError和OutOfMemoryError异常类型
四、Java堆
作用域:线程共享区域,存放这几乎所有的创建的对象实例,垃圾回收的主要区域
存储数据:所有对象创建的实例
异常类型:创建实例没有内存分配---OutOfMemoryError
五、方法区
作用域:线程共享区域
存储数据:被虚拟机加载的类信息、常量、静态变量和编译后的代码等数据
异常类型:内存不够时----OutOfMemoryError
5.1、常量池
作用域:方法区的一部分,所以是线程共享
存储数据:Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池
(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用
异常类型:OutOfMemoryError
六、直接内存
作用域:不是虚拟机运行的一部分
存储数据:可以作为一个辅助内存来使用,如NIO,可以将直接内存作为缓冲区来使用,可提高系统的效率。
异常类型:OutOfMemoryError