一、概述
当我们平时工作的时候,就学习java之初提到JVM,而后都着重学习java API 。然而,当我们在工作遇到outOfMemery的时候,可能无从下手,此时,深入JVM就相当有必要了。
二、JVM运行时数据区
三、线程共享区
线程共享区:多个线程运行时共享在同一个区域,比如方法区,线程共享区包含方法区和Java堆。
方法区:是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
Java堆:存储对象的实例。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。
四、线程独占区
线程独占区:我们都知道每个线程都是一个顺序的执行单元,线程独占区就是每个线程都有自己的独占单元,包括有自己的程序计数器,本地方法栈和虚拟机栈。
虚拟机栈:存放方法运行时所需的数据,成为栈帧。
本地方法栈:和虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。
程序计数器:是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。另外,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。
注意:程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域(因为开发者不会去操作程序计数器,它是jvm内部进行维护),它的生命周期随着线程的创建而创建,随着线程的结束而死亡。
网友评论