JVM系列之一 JVM的基础概念与内存区域

前言

做为一名 Java 语言的使用者,学习 JVM 有助于解决程序运行过程当中出现的问题、写出性能更高的代码。jvm

能够说:学好 JVM 是成为中高级 Java 工程师的必经之路。性能

有感于从未整理概括 JVM 相关的知识,因此打算写一系列 JVM 相关的文章,以加深巩固习得成果,为后续遗忘提供快速找回之途径。学习

1、JVM 是什么?

Java 虚拟机 (简称JVM,Java Virtual Machine) ,是运行 Java 程序的平台,准确来讲,是运行字节码的平台。操作系统

Java 为达成 Write Once, Run Everywhere 的目标,对于不一样操做系统有不一样的虚拟机实现,使用class 字节码做为中间码,JVM 执行字节码完成程序功能。.net

2、JVM的内存区域

一、程序计数器

程序计数器(Program Counter Register)是一小块线程私有的内存区域,生命周期与线程相同,可看做是当前线程执行字节码的行号指示器。是 JVM 中惟一一个不会出现 OOM(OutOfMemeryError)的区域。线程

若是线程执行的是一个 Java 方法,计数器记录的是正在执行的虚拟机字节码指令的地址;
若是执行的是一个 Native 方法,则计数器值为空。code

二、虚拟机栈

虚拟机栈(Virtual Machine Stack)是线程私有的内存区域,生命周期与线程相同描述着Java方法执行的内存模型:每一个方法在执行时都会建立一个栈帧(Stack Frame)用于存储局部变量表、操做数栈、动态连接、方法出口等信息。每一个方法执行完成就对应着销毁这个栈帧,即出栈。对象

此区域只会出现两种异常:blog

  • StackOverflowError:当申请的栈深度达到 JVM 容许的最大深度时抛出。
  • OutOfMemeryError:若是虚拟机栈可动态扩展,但申请不到足够内存时抛出。

三、本地方法栈

本地方法栈(Native Method Stack)与虚拟机栈做用相似,也是线程私有的内存区域,区别在于运行的是本地方法(Native Method)。生命周期

本地方法,即非Java语言实现的方法,好比C,使用本地方法能够扩充Java没有的语言特性。

四、堆

堆(Heap)是线程共享的内存区域,是JVM管理中最大的内存区域,惟一做用就是存放对象实例是 JVM 垃圾收集的主要区域

五、方法区

方法区(Method Area)又名非堆(Non-Heap)是线程共享的内存区域,存储着被 JVM 加载的类信息、常量、静态变量、即时编译器编译后的二进制等数据

六、运行时常量池

运行时常量池(Runtime Constant Pool)是方法区的一部分,用于存放编译期生成的字面量和符号引用,这部份内容将在类加载后进入方法区运行时常量池中存放。

七、直接内存

直接内存(Direct Memery)即经过native方法直接分配在堆外的内存。它不是JVM虚拟机运行时数据区的一部分,也不在JVM规范中定义,但这部份内存使用频繁,也可能致使OOM。

总结

JVM 是一个运行着字节码的平台,其运行时数据区包含 程序计数器、虚拟机方法栈、本地方法栈、堆、方法区,前三者是线程私有(隔离)的,后二者是线程共享的。

以上就是JVM的基本概念与其运行时数据区内存的内容。

参考

  • 《深刻理解Java虚拟机 第2版》周志明著

本文同步发布于本人csdn

相关文章
相关标签/搜索