
Java虚拟机在运行程序时会把其自动管理的内存划分为以上几个区域,每个区域都有的用途以及创建销毁的时机,其中绿色部分代表的是所有线程共享的数据区域,而蓝色部分代表的是每个线程的私有数据区域。
-
程序计数器
线程私有的内存区域。存储当前线程所执行的字节码的行号指示器,每条线程均有自己的程序计数器,而且各个线程间的程序计数器互不影响,独立存储。此区域是唯一一个在虚拟机规范中没有规定任何OutOfMemonyError情况的区域。 -
虚拟机栈
也是线程私有。该区域描述的是Java方法执行的内存模型:每个方法执行时都会创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机中从入栈到出栈的过程。该区域规定了StackOverflowError和OutOfMemonyError异常。 -
本地方法栈
本地方法栈属于线程私有的数据区域,这部分主要与虚拟机用到的 Native 方法相关,一般情况下,我们无需关心此区域。 -
Java堆
所有线程共享的一块内存区域。是Java虚拟机所管理的内存中最大的一块,在虚拟机启动时创建。该区域作用是存放对象实例,几乎所有的对象实例都在这里分配内存。Java堆是垃圾收集器管理的主要区域,也被称做“GC”堆。从内存回收的角度看,因为现在的收集器基本上都是采用分代收集算法,所以Java堆还可以细分为:新生代和老年代,再细分有Eden空间,From Survivor空间、To Survivor空间等,进一步划分的目的是为了更好的回收或者更快地分配。虚拟机规范中规定该区域可能发生OutOfMemonyError异常。 -
方法区
也是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。要注意的是Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它有个别名叫做Non-Heap,目的是和Java堆区分开来。该区域可以选择不实现垃圾回收,因为回收的情况难以令人满意,但是并不是如它的名字"永久代"一样不需要进行垃圾收集,在有些情况下还是有回收的必要。虚拟机规范中规定该区域可能发生OutOfMemonyError异常。
网友评论