运行时内存区域这块,如果不将内存各个区域做什么的了解清楚,后面看的会很累。
之前将JVM运行时内存区域的内容,整理在了一篇文章中。
在后续深入、细致的学习中,整理的内容越来越多,一篇的话,会导致篇幅过长。
所以将《JVM运行时内存区域详解》分为以下几个章节:
这里将《Java虚拟机规范中文版》上传了,点击下面链接,即可下载
目录
运行时内存区域
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。
根据《Java虚拟机规范(Java SE 7版)》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域:
(图片来自网络)
我们先看看上图灰色的部分:运行时数据区。图中很细心的帮我们做好了区分。
运行时数据区按照线程共享与否,可以划分为:线程共享与线程私有。
线程共享:方法区、堆
线程私有:Java栈(虚拟机栈)、本地方法栈、程序计数器
注意:堆是堆(heap),栈是栈(stack),堆栈是栈。
堆
线程共享,唯一作用就是存放对象实例。所有的对象实例及数组,都需要在堆中分配内存。
堆内存是垃圾收集器管理的主要区域,有时也被称为GC堆。
从内存回收的角度看,由于现在垃圾收集器都是基于分代收集算法,所以堆还可以被细分为:新生代和年老代。
堆可以处于物理上不连续的空间中,只要逻辑上连续即可。
方法区
线程共享,用于存储已被虚拟机加载的类信息、常量、静态变量等数据。
永久代是HotSpot虚拟机特有的概念,永久代是方法区的一种实现。
在《Java虚拟机规范》中,只是规定了有方法区这么一个概念和它的作用,并没有规定如何去实现它。
Java虚拟机栈
线程私有,虚拟机栈描述的是Java方法执行的内存模型。
每个方法在执行时会创建一个栈帧,用来存储局部变量表、操作数栈、方法出口等信息。
每一个方法从调用直至完成的过程,就对应一个栈帧在虚拟机栈中 入栈 到 出栈的过程。
本地方法栈
线程私有。本地方法栈 发挥的作用 与 Java虚拟机栈类似。
只不过 虚拟机栈 为虚拟机执行Java方法服务,而本地方法栈为虚拟机用到恩native方法。
简单地讲,一个Native Method就是一个java调用非java代码的接口。
程序计数器
线程私有,每个线程都有一个,用来记录线程执行到哪里。
因为多线程时,线程会来回切换,为了线程切换后回到正确的执行位置,每个线程都需要一个程序计数器。
隔条线程之间的程序计数器完全独立,互不影响。
为了方便理解,将学习到的运行时内存区域,以图例的方式画出来了,以供参考
(完整的visio文件上传了GitHub,需要的同学自取,如果觉得还不错,麻烦点个star)