前言

作为一名 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. 原生ajax分享

    最近被大佬问了一个很有趣的问题,你还能手打出一个ajax吗?,我当时的想法是有现成的为什么要自己打,后来我反思了一下(只有靠自己才是强者),在这里给大家分享一个我自己打的ajax,也是自己的一个知识点 ...

  2. Redis 实战 —— 07. 复制、处理故障、事务及性能优化

    复制简介 P61 关系型数据库通常会使用一个主服务器 (master) 向多个从服务器 (slave) 发送更新,并使用从服务器来处理所有读请求. Redis 也采用了同样的方法实现自己的复制特性,并 ...

  3. COLMAP简易教程(命令行模式)

    完整的 multi view stereo pipeline 会有以下步骤 structure from motion(SfM)==> camera parameters, sparse poi ...

  4. Salt (cryptography)

    Salt (cryptography) Here is an incomplete example of a salt value for storing passwords. This first ...

  5. Quartz 定时任务调度

    一.在Quartz.NET中quartz.properties的配置文件,忽略不修改,考虑下面: var props = new NameValueCollection { { "quart ...

  6. (二)基于shard-jdbc中间件,实现数据分库分表

    基于shard-jdbc中间件,实现数据分库分表 Sharding-JDBC简介 Sharding配置示意图 1.水平分割 1.1 水平分库 1.2 水平分表 2.Shard-jdbc中间件 2.1 ...

  7. Aruba无线控制器常用操作

    初始配置 1.console到初始化的无线控制器上 Enter System name [Aruba7005]: Enter VLAN 1 interface IP address [172.16.0 ...

  8. PA防火墙抓包结果显示重传(re-transmission)

    问题起因: 部分内网服务器调用外网站点抓取图片时出现缓慢及超时现象. 由于是由内向外方向的访问,且通过的应用层设备只有防火墙:而且用其他网段测试机测试的时候发现并没有上述访问缓慢或超时. 从防火墙抓包 ...

  9. 快速导出jekyll博客文件进行上传部署

    快速导出jekyll博客文件进行上传部署 在使用markdown书写jekyll博客时,经常需要写一个头部信息用以让jekyll读取博文信息,这是一件比较麻烦的事,因此我使用HTML实现了一个快速导出 ...

  10. 一篇文章图文并茂地带你轻松学完 JavaScript 继承

    JavaScript 继承 在阅读本文章之前,已经默认你了解了基础的 JavaScript 语法知识,基础的 ES6 语法知识 . 继承种类 简单的继承种类可以分为 构造函数继承 原型链继承 clas ...