开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情
JAVA中JVM的内存区域
概述
JVM的内存区域分为线程私有区域、线程共享区域、直接内存,其中线程私有区域又包含程序计数器、虚拟机栈、本地方法栈,线程共享区域包含方法区和堆。线程私有区域会随着线程的启动而创建,随着线程的结束而销毁,线程共享区域会随着线程的启动而创建,不会随着线程的结束而销毁,会随着虚拟机的关闭而销毁。
程序计数器
程序计数器(Program Counter Register)是线程私有的一块内存空间,可以简单认为存储的是字节码所执行的行号,是当前线程的行号指示器,字节码解释器通过改变程序计数器里面的值来取得下一条需要执行的字节码指令。每一个线程都有独立的程序计数器,互不影响。
虚拟机栈
虚拟机栈也是线程私有的一块内存空间,是描述JAVA方法的执行过程的内存模型,每一个线程在创建的时候都会创建一个虚拟机栈,每个虚拟机栈中保存着很多的栈帧,栈帧中存储这局部变量表、操作数栈、动态连接、方法出口等信息。
本地方法栈
本地方法栈也是线程私有区域,作用和JAVA虚拟机栈类似,区别是JAVA虚拟机栈是为虚拟机执行JAVA方法(字节码)服务,本地方法栈是为虚拟机中使用到的native方法服务。
方法区
方法区是线程共享的内存区域,它主要用来存储虚拟机加载的类型信息、常量、静态变量、代码缓存等数据,运行时常量池也是方法区的一部分。
堆
堆是JVM内存中最大的一块内存区域,也是线程共享的内存区域,存放的是对象实例。JAVA中垃圾收集器管理的主要就是堆这块区域,如果JVM中的堆没有内存进行实例分配,就会抛出
OutOfMemoryError异常。