如何从编程的本质理解JVM内存模型

一般聊JVM内存模型都是把图截出来,然后对着图,解释上面堆、栈之类的概念。这篇将分享下,如何从编程的本质上理解,JVM内存模型是什么样子,为什么是这个样子,不再死记硬背。

编程的本质

编程的本质是什么,有这么一句话,程序=算法+数据结构。
这里的"算法"其实相当宽泛,而平时理解的算法是指诸如排序、查找等操作,相对狭隘。所以换一个解释,我们把算法解释为对数据执行操作,简称执行。
这样,程序的本质便是数据+执行
而JVM作为JAVA程序的执行载体,必然从逻辑上与其相对应。

JVM内存模型

因此,JVM内存模型可以分为这么两部分:数据区、执行区。

数据区

任何程序,无论实现语言,它的数据总是可分为两类:元数据和业务数据。

  1. 元数据,指描述语言本身的数据,如类信息、指针、引用、即时编译代码等等。
  2. 业务数据,是指功能需求的数据,比如人事系统中的人员、部门数据,在面向对象的语言中以对象的形式存在。
    而在JVM内存模型中,元数据对应方法区(Method Area),而业务数据对应着Java堆(Java Heap)。
    书中解释如下:
    Java堆:存放对象实例和数组。
    方法区:存储加载的类信息、常量、静态变量、即时编译代码等
    因此,图示如下。

执行区

执行部分,首先我们得理解程序执行的基本单位是什么,是方法(或称函数)
通常的程序入口是main方法,单元测试也是基于方法。
平时交流时,也会说调下这个对象的方法,而不是调下这个对象。
甚至还有专门的函数式编程。
而在Java中,方法分为两种:Java方法和Native方法
在内存模型中,Java方法对应Java虚拟机栈(Java Virtual Machine Stacks),Native方法对应本地方法栈(Native Method Stack)
书中解释如下:

  1. Java虚拟机栈是方法执行的内存模型。
  2. 本地方法栈为虚拟机使用Native方法服务。
    除此之外,再加上程序计数器(Program Counter Register),为当前线程所执行的字节码的提供行号指示。
    主要的内存模型就画出来了。

    其中,数据区是通用的,所以线程共有,而执行区是线程执行自己的,所以线程私有。

    JVM内存模型

    再加上真正去执行程序的执行引擎,链接本地方法库,JVM内存模型就很好理解了。

    对比下书上的结构,逻辑上一致。

    以上。

    参考资料

    《深入理解Java虚拟机》

    作者

如何从编程的本质理解JVM内存模型的更多相关文章

  1. java 深入理解jvm内存模型 jvm学习笔记

    jvm内存模型 这是java堆和方法区内存模型 参考:https://www.cnblogs.com/honey01/p/9475726.html Java 中的堆也是 GC 收集垃圾的主要区域.GC ...

  2. 深入理解JVM内存模型

    1.程序计数器在虚拟机的概念模型里字节码解释器工作时就是通过改变 这个计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转.异常处理. Java 虚拟机的多线程是通过线程轮流切换并分配处理器执 ...

  3. 深入理解JVM(一)——JVM内存模型

    JVM内存模型 Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区. ...

  4. 【并发编程】一文带你读懂深入理解Java内存模型(面试必备)

    并发编程这一块内容,是高级资深工程师必备知识点,25K起如果不懂并发编程,那基本到顶.但是并发编程内容庞杂,如何系统学习?本专题将会系统讲解并发编程的所有知识点,包括但不限于: 线程通信机制,深入JM ...

  5. 走进JVM【二】理解JVM内存区域

    引言 对于C++程序员,内存分配与回收的处理一直是令人头疼的问题.Java由于自身的自动内存管理机制,使得管理内存变得非常轻松,不容易出现内存泄漏,溢出的问题. 不容易不代表不会出现问题,一旦内存泄漏 ...

  6. 深入理解java虚拟机学习笔记(一)JVM内存模型

    上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...

  7. 深入理解JVM内存分配策略

    理解JVM内存分配策略 三大原则+担保机制 JVM分配内存机制有三大原则和担保机制 具体如下所示: 优先分配到eden区 大对象,直接进入到老年代 长期存活的对象分配到老年代 空间分配担保 对象优先在 ...

  8. 深入理解JVM内存分配和常量池

    一.虚拟机的构成 虚拟结主要由运行时数据区.执行引擎.类加载器三者构成: 而我们所说的JVM内存模型指的就是运行时数据区,下面具体分析一下运行时数据区: 二.运行时数据区组成和各个区域的作用 我们看到 ...

  9. 深入理解JVM - JVM内存模型

    各版本的差异 JDK1.6 在JDK1.6 的时候运行时常量池在方法区中 JDK1.7 在JDK1.7 的时候运行时常量池在堆中 JDK1.8 在JDK1.8 的时候,JVM内存模型直接将方法区移到了 ...

随机推荐

  1. Ubuntu Linux下的Wireshark使用drcom_2011.lua分析drcom协议

    用文本编辑器打开init.lua配置文件,位置一般是//usr/share/wireshark/init.lua: sudo vim /usr/share/wireshark/init.lua 在in ...

  2. git操命令&&node操作命令

    1:删除远程库中的分支(现在本地删除该分支) git push origin --delete trunk分支 2:初始化一个新的工程 jdf install init xxx 3:编译好代码后,交给 ...

  3. 3d之ui快速切换图像

    Requirement canon相机continuous mode(Burst mode) 抓图variation (230~320ms) 1. python + opencv 用cvWaitKey ...

  4. vue 项目中,定时器(setInterval)的写法

    vue 项目中,定时器(setInterval)的写法: fetchJobList是一个方法,里面有dispatch一个action进行请求接口的代码. data () { return { inte ...

  5. bzoj 3674 可持久化并查集加强版——可持久化并查集

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3674 用主席树维护 fa[ ]  和 siz[ ] .改 fa[ ] 和改 siz[ ] 都 ...

  6. JZ2440 裸机驱动 第10章 系统时钟和定时器

    本章目标      了解S3C2410/S3C2440的时钟体系结构     掌握通过设置MPLL改变系统时钟的方法     掌握在不同的频率下设置存储控制器的方法     掌握PWM定时器的用法   ...

  7. Scrapy下xpath基本的使用方法

    Scrapy是基于python的开源爬虫框架,使用起来也比较方便.具体的官网档:http://doc.scrapy.org/en/latest/ 之前以为了解python就可以直接爬网站了,原来还要了 ...

  8. 树莓派3代B型 Raspberry Pi Model 3 B 安装 centos7系统

    板子类型: Raspberry Pi Model 3 B 搭配 32G的SD卡: 下载支持树莓派版本的centos7系统 https://buildlogs.centos.org/centos/7/i ...

  9. 【python】globle的使用

    python中直接定义的变量就是本地变量,使用global定义的变量就是全局变量.比如: a = 1 b = 1 def foo1(): global b #申明使用全局b a = 2 #a是本地变量 ...

  10. PHP与MySqli

    一:链接数据库: $mysqli=@new mysqli("localhost","root","123456","msqldb& ...