首页 > 技术文章 > Java内存区域

shamgod-lct 2018-07-22 15:34 原文

  Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人想出来。——《深入理解Java虚拟机》周志明

Java的运行时数据区域

  

程序计数器:是一块较小的内存空间,是当前线程所执行的字节码的行号指示器。该区域是线程私有的,也是唯一一个不会抛出OutOfMemoryError情况的区域。

Java虚拟机栈:线程私有的,生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同事会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。会抛出StackOverflowError和OutOfMemoryError。

本地方法栈:与虚拟机栈非常相似,区别在于虚拟机栈为虚拟机执行java方法服务,本地方法栈为虚拟机执行Native方法服务。本地方法栈也会抛出StackOverflowError和OutOfMemoryError。

Java堆:是Java虚拟机所管理的最大一块内存。是线程共享的一块区域。此内存区域的唯一目的就是存放对象实例。Java堆是垃圾收集器管理的主要区域,由于现在收集器基本使用分代收集算法,所以堆可以细分为:新生代和老年代,再细致一点的分为Eden空间、From Survivor空间、To Survivor空间。会抛出OutOfMemoryError。

方法区:也是线程共享的内存区域。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。会抛出OutOfMemoryError。

运行时常量池:是方法区的一部分。用于存放各种字面量和符号引用。会抛出OutOfMemoryError。

推荐阅读