首页 > 科技 >

Java内存区域与内存溢出异常

2019-01-05 15:37:30 网络整理 阅读:84 评论:0

Java内存管理是一个老生常谈的问题,虽然Java号称可以自动管理自己的内存,,使程序员从内存管理的围墙解放出来,但是一连串的内存泄漏和溢出方面的问题,使得我们不得不去深入了解Java的内存管理机制。本篇文章将从Java的内存区域开始剖析Jvm的内存机制,阐述内存溢出异常产生的原因以及解决办法。

运行时数据区域

众说周知,Java程序是运行在Java虚拟机中的,虚拟机顾名思义,就是一个虚拟的计算机。所以Java虚拟机也拥有一些与真实计算机相近的概念,比如栈,堆,程序计数器等,通常我们在这些概念面前加上虚拟机,以表明特指Java虚拟机的栈。

Java程序运行时,Java虚拟机会对内存进行管理,划分为若干个不同的数据区域,每个数据区域都有其不同的功能。根据《Java虚拟机规范(Java SE 7版)》的规定,Java虚拟机所管理的区域会包括以下几个运行时区域,如下图所示。

Java内存区域与内存溢出异常

下面我们一一介绍每个区域的不同功能。

程序计数器

程序计数器,即PC。学过计算机组成原理的同学一定对这个概念不陌生,在计算机组成原理中PC指的是PC寄存器,用来存放计算机执行的指令的所在内存区域的地址。而在Java虚拟机中,PC也有类似的作用,它的作用是存储当前线程所执行的字节码的行号指示器,通过改变这个计数器的值来选取下一条需要执行的字节码指令。与计算机PC不同的是,在Java虚拟机中,PC只是一块较小的内存空间,而不是寄存器。

由于Java虚拟机是多线程的,为了在线程之间进行隔离,每一个线程都会拥有一个独立的程序计数器。因此,在进行线程调度的时候,每个线程的执行互不影响。我们称这类内存区域为“线程私有”的内存。

程序计数器记录的只是正在执行的虚拟机字节码指令的地址,如果执行的是Native方法,那么计数器的值则为空。该内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

相关文章