如何从编程的本质理解JVM内存模型
如何从编程的本质理解JVM内存模型
一般聊JVM内存模型都是把图截出来,然后对着图,解释上面堆、栈之类的概念。这篇将分享下,如何从编程的本质上理解,JVM内存模型是什么样子,为什么是这个样子,不再死记硬背。
编程的本质
编程的本质是什么,有这么一句话,程序=算法+数据结构。
这里的"算法"其实相当宽泛,而平时理解的算法是指诸如排序、查找等操作,相对狭隘。所以换一个解释,我们把算法解释为对数据执行操作,简称执行。
这样,程序的本质便是数据+执行。
而JVM作为JAVA程序的执行载体,必然从逻辑上与其相对应。
JVM内存模型
因此,JVM内存模型可以分为这么两部分:数据区、执行区。

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

执行区
执行部分,首先我们得理解程序执行的基本单位是什么,是方法(或称函数)。
通常的程序入口是main方法,单元测试也是基于方法。
平时交流时,也会说调下这个对象的方法,而不是调下这个对象。
甚至还有专门的函数式编程。
而在Java中,方法分为两种:Java方法和Native方法
在内存模型中,Java方法对应Java虚拟机栈(Java Virtual Machine Stacks),Native方法对应本地方法栈(Native Method Stack)
书中解释如下:
- Java虚拟机栈是方法执行的内存模型。
本地方法栈为虚拟机使用Native方法服务。
除此之外,再加上程序计数器(Program Counter Register),为当前线程所执行的字节码的提供行号指示。
主要的内存模型就画出来了。

其中,数据区是通用的,所以线程共有,而执行区是线程执行自己的,所以线程私有。JVM内存模型
再加上真正去执行程序的执行引擎,链接本地方法库,JVM内存模型就很好理解了。

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

以上。参考资料
《深入理解Java虚拟机》
作者
- 作者:初开
- 我的开发小站:http://dev.chukai.pro
如何从编程的本质理解JVM内存模型的更多相关文章
- java 深入理解jvm内存模型 jvm学习笔记
jvm内存模型 这是java堆和方法区内存模型 参考:https://www.cnblogs.com/honey01/p/9475726.html Java 中的堆也是 GC 收集垃圾的主要区域.GC ...
- 深入理解JVM内存模型
1.程序计数器在虚拟机的概念模型里字节码解释器工作时就是通过改变 这个计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转.异常处理. Java 虚拟机的多线程是通过线程轮流切换并分配处理器执 ...
- 深入理解JVM(一)——JVM内存模型
JVM内存模型 Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区. ...
- 【并发编程】一文带你读懂深入理解Java内存模型(面试必备)
并发编程这一块内容,是高级资深工程师必备知识点,25K起如果不懂并发编程,那基本到顶.但是并发编程内容庞杂,如何系统学习?本专题将会系统讲解并发编程的所有知识点,包括但不限于: 线程通信机制,深入JM ...
- 走进JVM【二】理解JVM内存区域
引言 对于C++程序员,内存分配与回收的处理一直是令人头疼的问题.Java由于自身的自动内存管理机制,使得管理内存变得非常轻松,不容易出现内存泄漏,溢出的问题. 不容易不代表不会出现问题,一旦内存泄漏 ...
- 深入理解java虚拟机学习笔记(一)JVM内存模型
上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...
- 深入理解JVM内存分配策略
理解JVM内存分配策略 三大原则+担保机制 JVM分配内存机制有三大原则和担保机制 具体如下所示: 优先分配到eden区 大对象,直接进入到老年代 长期存活的对象分配到老年代 空间分配担保 对象优先在 ...
- 深入理解JVM内存分配和常量池
一.虚拟机的构成 虚拟结主要由运行时数据区.执行引擎.类加载器三者构成: 而我们所说的JVM内存模型指的就是运行时数据区,下面具体分析一下运行时数据区: 二.运行时数据区组成和各个区域的作用 我们看到 ...
- 深入理解JVM - JVM内存模型
各版本的差异 JDK1.6 在JDK1.6 的时候运行时常量池在方法区中 JDK1.7 在JDK1.7 的时候运行时常量池在堆中 JDK1.8 在JDK1.8 的时候,JVM内存模型直接将方法区移到了 ...
随机推荐
- 【WebForm】知识笔记
一.ashx介绍以及ashx文件与aspx文件之间的区别 ashx是什么文件? .ashx 文件用于写web handler的. .ashx文件与.aspx文件类似,可以通过它来调用HttpHandl ...
- 【BZOJ1702】[usaco2007margold]队列平衡
原来蛤习线性探测的时候要每次加一个稍大一点的数而不是每次+1……连蛤习都不会写,我tmd是有多弱 原题: N(1<=N<=100000)头牛,一共K(1<=K<=30)种特色, ...
- arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf等的区别
博客来之于: http://www.veryarm.com/296.html 命名规则: 交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi] arch - ...
- M端计算rem方法
(function(){var a=document.documentElement.clientWidth||document.body.clientWidth;if(a>460){a=460 ...
- 使用Reaction cli 创建应用
默认简单跑起来,我们可以直接使用docker,同时官方也为我们提供了cli 工具,可以快速的创建应用 安装cli npm install -g reaction-cli 初始化项目 reaction ...
- Nginx 安装成Windows 服务方法
1. 下载nginx windows版本 http://www.nginx.org 2. 下载微软的2个工具: instsrv.exe.srvany.exe 去微软网站下载安装Windows Serv ...
- Mac 下 java环境 maven环境配置
java环境配置 下载jdk,按照提示安装 我下的是1.8.0版本,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8- ...
- Servlet 实现网页计数器
创建CounterSerlet, 使用getServletContext,ServletContext 从request.getSession().getServletContext();获得 @We ...
- Git密钥生成步骤SSH Key
顺便推荐下自己的网站: 一个php后台极速开发框架 https://www.lotusadmin.top/ 一个有趣的网站 https://www.waytomilky.com/ Git是分布式的代码 ...
- Letterbox,Pillarbox和Pan&Scan
Auto 不改变窗口设置16:9 PillarBox: 4:3的图像,在16:9的显示屏上显示时,上下到顶,左右会添加黑边. 16:9 Pan&Scan 4:3的图像,在16:9的显示屏上显示 ...