前言

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

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

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

一、JVM 是什么?

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

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

二、JVM的内存区域

1、程序计数器

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

如果线程执行的是一个 Java 方法,计数器记录的是正在执行的虚拟机字节码指令的地址;

如果执行的是一个 Native 方法,则计数器值为空。

2、虚拟机栈

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

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

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

3、本地方法栈

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

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

4、堆

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

5、方法区

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

6、运行时常量池

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

7、直接内存

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

总结

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

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

参考

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

本文同步发布于本人csdn

JVM系列之一 JVM的基础概念与内存区域的更多相关文章

  1. jvm系列(1):JVM问答

    一:JVM基础知识 1)Java 是如何实现跨平台的? 注意:跨平台的是 Java 程序,而不是 JVM.JVM 是用 C/C++ 开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的 ...

  2. jvm系列(八):jvm知识点总览-高级Java工程师面试必备

    在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...

  3. jvm系列(四):jvm知识点总结

    原文链接:http://www.cnblogs.com/ityouknow/p/6482464.html jvm 总体梳理 jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 ...

  4. jvm系列(八):jvm知识点总览

    在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...

  5. JVM系列五:JVM监测&工具

    JVM系列五:JVM监测&工具[整理中]  http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介 ...

  6. jvm系列(七):jvm调优-工具篇

    16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗 ...

  7. JVM系列三:JVM参数设置

    JVM系列三:JVM参数设置.分析   不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运 ...

  8. 【JVM】JVM系列之JVM体系(一)

    一.前言 为什么要学习了解Java虚拟机 1.我们需要更加清楚的了解Java底层是如何运作的,有利于我们更深刻的学习好Java. 2.对我们调试错误提供很宝贵的经验. 3.这是合格的Java程序必须要 ...

  9. jvm系列 (一) ---jvm内存区域与溢出

    jvm内存区域与溢出 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 为什么学习jvm 木板原理,最短的一块板决定一个水的深度,当一个系统垃圾收集成为瓶颈的时 ...

随机推荐

  1. Ubuntu安装记录

    好吧,这成功地让我想起了那些边肯红薯边黑苹果的早晨······ 本人纯属Windows用腻,后期请大佬多多指教 前面因为没U盘而碰壁的内容在此不说,接下来因为太兴奋,关于安装U盘制作没记录什么.最终, ...

  2. Redis 核心篇:唯快不破的秘密

    天下武功,无坚不摧,唯快不破! 学习一个技术,通常只接触了零散的技术点,没有在脑海里建立一个完整的知识框架和架构体系,没有系统观.这样会很吃力,而且会出现一看好像自己会,过后就忘记,一脸懵逼. 跟着「 ...

  3. feign使用okHttpClient,调用原理

    最近项目中 spring cloud 用到http请求,使用feign,配置okhttp,打算配置一下就直接使用,不过在压测与调优过程中遇到一些没有预测到的问题,附上排查与解析结 yml.pom配置 ...

  4. GRASP职责分配模式

    https://mp.weixin.qq.com/s/IaxAnWfVqe3mM0bHFVV5Gg 软件开发必修课:你该知道的GRASP职责分配模式 原创 悟真 阿里技术 今天 收录于话题 #设计模式 ...

  5. circus reload

    circus reload Configuration - Circus 0.15.0 documentation https://circus.readthedocs.io/en/latest/fo ...

  6. 可视化Go内存管理

    小结: 1. Go不需要VM,Go应用程序二进制文件中嵌入了一个小型运行时(Go runtime),可以处理诸如垃圾收集(GC),调度和并发之类的语言功能 Go does not need a VM ...

  7. 基于nginx的频率控制方案思考和实践

    基于nginx的频率控制方案思考 标签: 频率控制 nginx 背景 nginx其实有自带的limit_req和limit_conn模块,不过它们需要在配置文件中进行配置才能发挥作用,每次有频控策略的 ...

  8. 日记 + sb错误

    置顶消息cpdd 1.29 完了,文化课没了 我是废物 1.28 更新了自己的副标题 前副标题:Future never has to do with past time,but present ti ...

  9. 数据分析中常用的Excel函数

    数据分析中excel是一个常见且基础的数据分析工具,要想掌握好它,学会使用其中的常用函数是一个绕不过去的坎.从网上搜集的资料来说,基本上确定了数据分析中Excel的常用函数有以下这六类 数学函数:SU ...

  10. (一)Spring-Boot-操作-Redis

    Spring-Boot-操作-Redis 1.Spring Data Redis 1.1 引入依赖 1.2 配置 Redis 信息 1.3 使用 2.Spring Cache 2.1 引入依赖 2.2 ...