JVM内存区域

2020-01-13  本文已影响0人  wervy

java内存结构是每个java程序员必须掌握的,由于Java程序都由JVM执行,所以我们在谈java内存区域划分时,其实就是JVM内存区域划分

我们来看一下java程序的执行流程:首先Java源代码文件(.java后缀)会被Java编译器编译成字节码文件(.class后缀)
然后由JVM的类加载器加载各个类的字节码文件,加载完毕后,交由JVM执行引擎执行。
主要包括以下几个部分:

(1) 方法区
(2)虚拟机栈
(3)本地方法栈
(4)堆
(5)程序计数器

程序计数器

程序计数器是一块较小的内存空间,可以看做当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成。

特点

(1) 线程私有 每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储
(2)是java虚拟机规范里面, 唯一 一个 没有规定任何 OutOfMemoryError 情况的区域(程序计数器保存的是当前字节码的偏移地址,当执行到下一条指令时,改变的只是程序计数器保存的地址,并不需要申请新的内存)
(3)生命周期随着线程启动而产生,线程结束而消亡

本地方法栈

本地方法栈则为虚拟机使用到的Native方法服务,与虚拟机栈一样,为线程私有,本地方法栈会抛出StackOverflowError和OutOfMemoryError异常

虚拟机方法栈

虚拟机方法栈为虚拟机执行Java方法服务,线程私有

堆(Heap)

java堆是Java虚拟机所管理的内存中最大的一块。java堆是所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

我们平常所说的垃圾回收,主要是堆区,因此也被称为GC堆

方法区

方法区是被所有线程共享的区域,用于存放已被虚拟机加载的类信息,常量,静态变量等数据,根据Java虚拟机规范,当方法区无法满足内存分配的需求时,将会抛出OutOfMemoryError

上一篇下一篇

猜你喜欢

热点阅读