如何从编程的本质理解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虚拟机》

    作者

最新文章

  1. ASP.NET WebAPI 14 仿写Filter管道
  2. OpenJudge/Poj 1658 Eva's Problem
  3. WEB黑客工具箱之LiveHttpHeaders介绍
  4. 什么是JavaScript?
  5. 未能正确加载“visual C++ package”包
  6. 让MyEclipse里的Tomcat自动reloadable
  7. .NET 简单的扩展方法使用。
  8. appium+Linux环境安装配置
  9. Luogu4149:[IOI2011]Race
  10. CSS中编写省略号代码片段
  11. canal-随记001-吐血一个下午找bug
  12. Bzoj5332: [Sdoi2018]旧试题
  13. Python3字符编码
  14. MySQLdb与sqlalchemy的简单封装
  15. 中国网建SMS短信接口调用(java发送和接收手机短信)
  16. oop(Object Oriented Programming)
  17. uploadify3.2.1 多文件上传总是只能上传一个文件
  18. VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control)
  19. html-w3c规范及常见标签
  20. SQL中的CASE WHEN使用

热门文章

  1. zookeeper 官方文档——综述
  2. Windows10 解决“装了 .NET Framework 4.5.2/4.6.1/4.7.1等等任何版本 或版本更高的更新”问题
  3. 剑指offer-第一个只出现一次的字符-字符串和数组
  4. YUV和RGB之间的转换方法
  5. virtualbox安装增强功能并设置共享文件夹
  6. Angular 4.0 安装组件
  7. 如何使用Django 启动命令行及执行脚本
  8. Openwrt 3G模块的添加
  9. keepalived的配置详解(非常详细)
  10. jsoncpp 构造空数组