前言

上篇文章我们一起了解了jvm虚拟机类的加载机制,而且是以一种纯大白话进行的一场闲聊,相信小伙伴们应该印象深刻,感兴趣的小伙伴可以重温一下上一篇文章大白话谈JVM的类加载机制

当jvm加载了类后,会把需要使用的对象放入到内存当中,那么jvm的内存模型是什么样的呢?

今天我们就来探索一下jvm的内存模型。由于有小伙伴反映想加些图更容易理解,王子接下来的文章打算用更多的图例来讲解。

方法区

很多小伙伴之前也了解过jvm的内存模型,知道有方法区这个东西,但可能了解的不是很详细。

其实方法区是在JDK1.8以前的版本里存在的一块内存区域,主要就是存放从class文件里加载进来的类的,而且常量池也是在这块区域内的。

但是在JDK1.8之后,这块区域摇身一变,换了名字,叫做“Metaspace”,翻译过来就是“元数据空间”的意思。当然它只是改了个名,实现的功能是没变的。

程序计数器

假设我们的代码是这样的:

public class Main {
public static void main(String[] args) {
SysUser sysUser = new SysUser();
sysUser.setAvatar("1");
}
}

这个是我们的java代码,是面向我们开发者的,然后会编译成class字节码文件,在class字节码文件中存放的是一条条的字节码命令,他对应了一条条的机器指令,计算机只有读到机器指令才知道它要干什么。

所以当JVM加载类信息后,实际上就是使用字节码执行引擎去执行我们的代码编译出来的一条条字节码指令,如下图。

那么在执行字节码指令的时候,jvm是怎么知道该执行哪条指令了呢?这时候程序计数器就出现了。

它就是用来记录当前执行的字节码指令位置的。

另外,小伙伴们都知道,JVM是支持多线程的,所以如果我们开启了多线程,就会有多个线程在执行不同的字节码指令,为了他们之间的字节码指令不会混在一起,所以每个线程都会有自己的程序计数器,用来记录每个线程自己的指令现在执行到哪一条了,如下图:

JAVA虚拟机栈

我们现在知道,jvm执行class中指令时是通过程序计数器来锁定执行的指令位置的,但是在我们执行的方法里,会有很多的局部变量等数据,虚拟机栈就是用来保存方法的局部变量的,而且每个线程都会有自己的虚拟机栈,比如我们之前的代码:

public class Main {
public static void main(String[] args) {
SysUser sysUser = new SysUser();
sysUser.setAvatar("1");
}
}

这个代码会启动一个main线程,并把局部变量sysUser保存到栈中。

如果线程执行了一个方法,就会对这个方法调用创建一个栈帧,然后就是所谓的压栈操作(先进后出),如下:

然后我们代码继续执行,调用了setAvatar方法,那么就会继续创建栈帧,如下:

当setAcatar方法执行完毕,就会对方法的栈帧执行出栈操作。

以上就是JAVA虚拟机栈这一部分的作用,简单概括就是:调用方法就创建栈帧,压栈,方法执行完就执行出栈操作

JAVA堆内存

说完了java虚拟机栈,那我们再来说一个很重要的内存区域java堆内存,它是用来存放我们代码中创建的各种对象的。

还是以刚才的代码为例,当我们执行new SysUser()的时候,就创建了一个SysUser实例对象,而这个对象本身又会有很多的属性和方法,这样的实例化对象的数据就是存放在堆内存中的。

而这个时候我们在栈中存储的局部变量实际上存的就是这个对象的内存地址,也可以理解为一个引用地址。如下图:

到这里JVM的内存区域已经和小伙伴们介绍完了,给大家来一张整体的内存区域图,以便理解:

其他内存区域

除了前文我们介绍的内存区域,jdk的api中(io、nio、socket)相关,其实它们的内部已经不是java代码了,而是调用了native方法调用了本地操作系统的一些方法,可能是c语言编写的或者是一些底层类库。

在调用native方法的时候,线程就会对应本地方法栈,这个是于java虚拟机栈类似的东东,放的就是native方法的各种局部变量表。

除此之外还有一个区域,是不属于JVM的,通过NIO的allocateDirect的api,可以在堆外分配内存空间,从而直接操作堆外的内存空间数据。

有些场景下,堆外内存空间会提升性能,这个问题我们之后再逐步探索,今天就不说这个了。

总结

本文到这里就结束啦,王子采纳了一些小伙伴的意见,画了很多图有助于小伙伴们更好的理解,希望能够帮到大家。

那我们下篇文章见。

往期文章推荐:

大白话谈JVM的类加载机制

JVM内存模型不再是秘密的更多相关文章

  1. JVM内存模型和性能优化 转

    JVM内存模型和性能优化 JVM内存模型优点 内置基于内存的并发模型:      多线程机制 同步锁Synchronization 大量线程安全型库包支持 基于内存的并发机制,粒度灵活控制,灵活度高于 ...

  2. jvm内存模型-回收算法-和内存分配以及jdk、jre、jvm是什么关系(阿里,美团,京东面试题)

    1.什么是jvm?(1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的.(2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个 ...

  3. Inside JVM 内存模型

    Inside JVM 内存模型 来源  原文:https://blog.csdn.net/silentbalanceyh/article/details/4661230 参考:IBM开发中心文档,&l ...

  4. [转]JVM内存模型

    最近排查一个线上java服务常驻内存异常高的问题,大概现象是:java堆Xmx配置了8G,但运行一段时间后常驻内存RES从5G逐渐增长到13G #补图#,导致机器开始swap从而服务整体变慢.由于Xm ...

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

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

  6. 程序猿的日常——JVM内存模型与垃圾回收

    Java开发有个很基础的问题,虽然我们平时接触的不多,但是了解它却成为Java开发的必备基础--这就是JVM.在C++中我们需要手动申请内存然后释放内存,否则就会出现对象已经不再使用内存却仍被占用的情 ...

  7. JVM内存模型和垃圾回收

    Java开发有个很基础的问题,虽然我们平时接触的不多,但是了解它却成为Java开发的必备基础——这就是JVM.在C++中我们需要手动申请内存然后释放内存,否则就会出现对象已经不再使用内存却仍被占用的情 ...

  8. JVM内存模型 三

    本文章节: 1.JMM简介 2.堆和栈 3.本机内存 4.防止内存泄漏   1.JMM简介 i.内存模型概述 Java平台自动集成了线程以及多处理器技术,这种集成程度比Java以前诞生的计算机语言要厉 ...

  9. 【Java_基础】JVM内存模型与垃圾回收机制

    1. JVM内存模型 Java虚拟机在程序执行过程会把jvm的内存分为若干个不同的数据区域来管理,这些区域有自己的用途,以及创建和销毁时间. JVM内存模型如下图所示 1.1 程序计数器 程序计数器( ...

随机推荐

  1. Git-commit-中添加表情

    git commit 中使用表情 我们经常可以在github上看到国外大佬的commit信息中有很多可爱的表情,这是怎么做到的呢? ok,可以这样使用哦:git commit -m '提交信息 :em ...

  2. Linux环境下MySQL 5.6安装与配置----亲测有效----纯离线安装

    一.安装MySQL 1.下载安装包 mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz 下载地址: https://dev.mysql.com/get/Downloa ...

  3. update 字符串拼接

    UPDATE store SET food_ordering =1,self_pickup_remark = CONCAT('self pick up notes:',store_code,short ...

  4. 阿里面试竟如此轻松,2招带你过关斩将拿下offer

    在找工作之前首先是要认清一个问题,虽然这个问题比较俗,但是很现实,就是为什么追求高工资? 这个问题我想不用说大家心里也清楚.大部分人都不是当前城市的本地人,说好听了叫来上班,说的不好听其实叫“外来务工 ...

  5. 使用echarts 轻松搞定各种后台数据统计

    之前接到老大一个需求,需要将公私生态系统构建一个日志系统,统计公有云.私有云还有其他工具平台(如禅道,jenkins)的用户登录信息,并使用图标的形式动态显示,之前刚入门的时候接触过echarts 这 ...

  6. Spine应用--使用Spine动画制作动作游戏

    在前面的文章中,已经陆陆续续的讲解了一些使用Spine动画的细节,有了这些细节,我们已经满足了在unity中使用Spine动画制作动作游戏的技术基础. 那么,要使用Spine动画在unity中制作一款 ...

  7. 【python】装饰器听了N次也没印象,读完这篇你就懂了

    装饰器其实一直是我的一个"老大难".这个知识点就放在那,但是拖延症... 其实在平常写写脚本的过程中,这个知识点你可能用到不多 但在面试的时候,这可是一个高频问题. 一.什么是装饰 ...

  8. 手写mybatis框架

    前言 很久没有更新mybatis的源码解析了,因为最近在将自己所理解的mybatis思想转为实践. 在学习mybatis的源码过程中,根据mybatis的思想自己构建了一个ORM框架 .整个代码都是自 ...

  9. ElasticSearch7.6.1 概述

    本来打算重新回去看 并发编程的,之前看过一遍,现在基本忘完了,然后因为考虑到项目的需要,就先看ES了 然后再B站上看到一个视屏比较火,就看这个吧 给大家推荐一下 https://www.bilibil ...

  10. IIS上传文件最大限制问题

    IIS服务器文件最大限制默认是30M. 自定义方法:修改配置文件,路径是:C:\Windows\System32\inetsrv\Config\applicationHost.config 在requ ...