您的位置:首页 > 其它

深入JVM-内存管理

2016-02-17 13:26 141 查看
引言:Java虚拟机在程序执行过程中会把内存分为多个不同的区域,这些区域都有各自的用途,以及创建和销毁的时间。根据Java虚拟机规范规定,Java虚拟机所管理的内存包含以下几个区域。
<img src="https://img-blog.csdn.net/20160218090239523?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

1、计数器

程序计数器 内存中较小的一块内存空间,可以看做线程执行字节码的行号计数器。在虚拟机的概念模型里就是通过它来取得下一条要执行的字节码指令。分支、循环、跳转异常……都需要它来帮助实现。因为Java多线程是采用线程轮流切换并分配处理器执行来实现的,所以在一个确定的时间内都只会执行一个线程的任务。当线程切换后需要回到正确的执行位置,每条线程都需要一个独立的计数器。特性提现为:各条线程的计数器独立存储、互不影响 、线程私有。

2、栈

栈在线程私有方面与 计数器 有着相同的特性。虚拟栈存储可以描述为Java方法执行内存模型,每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、动态链接、方法出口等信息。每一个方法执行到执行完成的过程,对应着虚拟机进栈到出栈的过程。局部变量表存放了编译期可知的所有基本类型,对象引用、Return Address类型(后续执行字节码指令地址)。局部变量表的内存占用在编译期即可确定,在方法运行期不会改变局部变量表的内存大小。当栈的深度大于虚拟规范规定的深度将会抛出 StackOverflowError异常。当栈无法扩展时,会抛出 OutOfMemoryError 异常。

3、本地方法区(本地方法栈)

本地方法栈与虚拟栈功能非常类似。区别在于 虚拟机栈为执行Java方法服务,而本地方法栈是为了虚拟机用到的Native方法服务。由于虚拟机规范没有对本地方法栈做出特殊规范,所以在Hotspot虚拟机干脆将本地方法栈与虚拟机栈合二为一。

4、堆

堆内存是JVM所管理内存中最大的一块。堆是被所有线程共享的一块区域,在虚拟机启动时创建。堆内存区域唯一的目的就是存放对象实例,这一点java虚拟机规范中描述为:“所有的对象实例以及数组都要在堆上分配内存”。当堆内存无法扩展时,会抛出 OutOfMemoryError 异常。

5、方法区

方法区也是线程共享的区域,用于存储 类信息、常量、静态变量、编译后的代码等数据。待续……

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: