如何从编程的本质理解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. Pr学习日记

    1.http://tieba.baidu.com/p/4102775256   2.素才,编辑制作视频,视频输出    3. 启用新建保存:     启用:双击    新建项目:名称(第一节课),位置 ...

  2. BZOJ3230: 相似子串【后缀数组】

    Description Input 输入第1行,包含3个整数N,Q.Q代表询问组数. 第2行是字符串S. 接下来Q行,每行两个整数i和j.(1≤i≤j). Output 输出共Q行,每行一个数表示每组 ...

  3. Wireless Network 并查集

    An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wi ...

  4. 《DSP using MATLAB》Problem 4.12

    代码: function [As, Ac, r, v0] = invCCPP(b0, b1, a1, a2) % Determine the signal parameters Ac, As, r, ...

  5. LeetCode-Microsoft-Remove K Digits

    Given a non-negative integer num represented as a string, remove k digits from the number so that th ...

  6. 理解cookie和session技术

    一.HTTP协议的无状态性 WEB应用程序使用的是HTTP协议传输数据的,HTTP协议是一个无状态的协议,这次数据传输完毕,客户端会和服务端断开连接,再次传输数据就需要重新建立新的连接,这也就无法会话 ...

  7. oracle C# 访问

    使用oracle的odp.net 进行oracle数据库的访问对于进行oracle数据库的开发来说是比较方便的,使用的方式与ADO.net 是一致的. 一下为使用的测试 1. 安装必要的oracle ...

  8. log parser 微软iis 日志分析

    Log Parser 2.2 您可以从 Microsoft 下载中心下载 Log Parser. Log Parser 2.2 是一个功能强大的通用工具,它可对基于文本的数据(如日志文件.XML 文件 ...

  9. 【模式识别】MPL,MIL和MCL

    Multi-Instance Learning (MIL) 和Multi-Pose Learning (MPL)是CV的大牛Boris Babenko at UC San Diego提出来的.其思想能 ...

  10. DOS批处理 - 函数教程

    DOS Batch - Function Tutorial What it is, why it`s important and how to write your own. Description: ...