JVM内存结构介绍

02b1894daa1a44e3a93ecf4842f46325.jpg我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。其中有些区域随着虚拟机进程的启动而存在,而有些区域则依赖用户线程的启动和结束而建立和销毁。在《Java虚拟机规范(Java SE 8)》中描述了JVM运行时内存区域结构如下:

 

 

 

 

各个区域的功能不是本文重点,就不在这里详细介绍了。这里简单提几个需要特别注意的点:

 

1、以上是Java虚拟机规范,不同的虚拟机实现会各有不同,但是一般会遵守规范。

 

2、规范中定义的方法区,只是一种概念上的区域,并说明了其应该具有什么功能。但是并没有规定这个区域到底应该处于何处。所以,对于不同的虚拟机实现来说,是由一定的自由度的。

 

3、不同版本的方法区所处位置不同,上图中划分的是逻辑区域,并不是绝对意义上的物理区域。因为某些版本的JDK中方法区其实是在堆中实现的。

 

4、运行时常量池用于存放编译期生成的各种字面量和符号应用。但是,Java语言并不要求常量只有在编译期才能产生。比如在运行期,String.intern也会把新的常量放入池中。

 

5、除了以上介绍的JVM运行时内存外,还有一块内存区域可供使用,那就是直接内存。Java虚拟机规范并没有定义这块内存区域,所以他并不由JVM管理,是利用本地方法库直接在堆外申请的内存区域。

 

6、堆和栈的数据划分也不是绝对的,如HotSpot的JIT会针对对象分配做相应的优化。

 

如上,做个总结,JVM内存结构,由Java虚拟机规范定义。描述的是Java程序执行过程中,由JVM管理的不同数据区域。各个区域有其特定的功能。

 

 

 

Java内存模型

Java内存模型看上去和Java内存结构(JVM内存结构)差不多,很多人会误以为两者是一回事儿,这也就导致面试过程中经常答非所问。

 

在前面的关于JVM的内存结构的图中,我们可以看到,其中Java堆和方法区的区域是多个线程共享的数据区域。也就是说,多个线程可能可以操作保存在堆或者方法区中的同一个数据。这也就是我们常说的“Java的线程间通过共享内存进行通信”。

 

Java内存模型是根据英文Java Memory Model(JMM)翻译过来的。其实JMM并不像JVM内存结构一样是真实存在的。他只是一个抽象的概念。JSR-133: Java Memory Model and Thread Specification中描述了,JMM是和多线程相关的,他描述了一组规则或规范,这个规范定义了一个线程对共享变量的写入时对另一个线程是可见的。

 

那么,简单总结下,Java的多线程之间是通过共享内存进行通信的,而由于采用共享内存进行通信,在通信过程中会存在一系列如可见性、原子性、顺序性等问题,而JMM就是围绕着多线程通信以及与其相关的一系列特性而建立的模型。JMM定义了一些语法集,这些语法集映射到Java语言中就是volatile、synchronized等关键字。

 

 

 

在Java中,JMM是一个非常重要的概念,正是由于有了JMM,Java的并发编程才能避免很多问题。这里就不对Java内存模型做更加详细的介绍了,想了解更多的朋友可以参考《Java并发编程的艺术》。

 

 

 

 

 

Java对象模型

Java是一种面向对象的语言,而Java对象在JVM中的存储也是有一定的结构的。而这个关于Java对象自身的存储模型称之为Java对象模型。

 

HotSpot虚拟机中,设计了一个OOP-Klass Model。OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象实例的具体类型。

 

每一个Java类,在被JVM加载的时候,JVM会给这个类创建一个instanceKlass,保存在方法区,用来在JVM层表示该Java类。当我们在Java代码中,使用new创建一个对象的时候,JVM会创建一个instanceOopDesc对象,这个对象中包含了对象头以及实例数据。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/143099.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

二维码生成器如何制作二维码

1.首先我们打开Excel软件,新建一个空白工作簿。 ​ 2.然后我们点击【图片工具】选项(Excel工具箱,百度即可了解详细的下载安装信息,本文这里就不做具体解说) 3.在【二维码】选项内点击【单个生成】 4.然后我们在【二维码内容】中录…

二维码生成之如何制作名片二维码

1.首先我们打开Excel文件 ​ 2.任选一个单元格录入名片信息 ​ 3.然后选中此单元格 ​ 4.点击【图片工具】(Excel工具箱,百度即可了解详细的下载安装信息,本文这里就不做具体解说) 5.点击【单个生成】 6.最后点击【保存】将制作好…

如何生成简单的二维码

这里以草料二维码为例 由于需要前后端一起才能实现所以仅提供思路 由于 草料二维码生成的二维码比较繁琐,用户再扫描的时候反应慢而且有时候会扫描失败 下面是简化二维码的流程,仅供参考。图片来自哔站大佬:三分钟的Peter谭

生成二维码如何制作二维码

1.生活中我们经常会遇到二维码,可是是怎么制作的呢?下面就跟大家分享一下。首先我们打开Excel。 2.在任意一个单元格内录入我们想要转为二维码的数据信息。 3.然后点击【图片工具】 4.点击【单个生成】 5.然后选择【预览】 6.最后点击【保存】即可完成 ​…

二维码生成

1.引入js文件 <script src"../js/jquery-1.10.2.min.js"></script> <script src"../js/jquery.qrcode.min.js"></script>js文件下载地址 》 戳我 2.创建一个放二维码的dom <div id"qrcode">3.生成二维码 $(fu…

小程序参数二维码生成

小程序参数二维码生成工具&#xff1a;芝麻小程序码 支持接口A&#xff0c;菊花小程序参数二维码。接口B&#xff1a;小程序场景二维码&#xff0c;接口C&#xff1a;普通小程序二维码 获取二维码 通过后台接口可以获取小程序任意页面的二维码&#xff0c;扫描该二维码可以直…

小程序中生成二维码

小程序中生成二维码 在做小程序的项目的时候&#xff0c;需要把某些链接生成二维码供用户下载或者扫描使用 1、下载qrcode文件 2、引入 import qrcode from ./../../util/qrcode;3、使用 <view class"init_cabvas"><canvas id"myCanvas" class…

微信小程序之条形码和二维码生成

1.首先在utils文件下创建barcode.js,qrcode.js与index.js三个文件 barcode.js 代码如下 var CHAR_TILDE 126; var CODE_FNC1 102;var SET_STARTA 103; var SET_STARTB 104; var SET_STARTC 105; var SET_SHIFT 98; var SET_CODEA 101; var SET_CODEB 100; var SET_ST…

如何生成二维码?生成二维码其实很简单

如何生成二维码&#xff1f;在日常的工作学习中我们总是会接触到各种各样的二维码&#xff0c;比如支付宝收款码、公众号主页码、广告宣传码等等。有一些二维码我们直接保存就可以&#xff0c;但是有一些二维码却需要我们自己进行制作。下面小编就来给大家分享二维码的生成小程…

微信小程序实现条形码,二维码生成和微信小程序扫码

一&#xff1a;条形码,二维码生成 在微信小程序中生成条形码和二维码需要使用到wxbarcode的npm包&#xff0c;wxbarcode的npm包地址&#xff1a;https://www.npmjs.com/package/wxbarcode 1&#xff1a;安装wxbarcode npm i wxbarcode -S --production 在微信小程序项目中使…

转载:在微信小程序中 生成二维码

目录 转载&#xff1a; weapp-qrcode-canvas-2d 仓库地址 测试环境 使用 安装方法1&#xff1a;直接引入 js 文件 安装方法2&#xff1a;npm安装 安装完成后调用 例子1&#xff1a;没有使用叠加图片 例子2&#xff1a;使用叠加图片(在二维码中加logo) 这里是API dr…

前端生成二维码 微信小程序

1&#xff0c;在微信开发者工具里面引入npm命令“ npm install weapp-qrcode --save ”&#xff1b; 2&#xff0c;将 dist 目录下的weapp.qrcode.esm.js 复制到项目的utils目录中&#xff1b; 3&#xff0c;在所需的index.js页面引入weapp.qrcode文件。并调用drawQrcode()方法…

微信小程序生成自定义参数二维码

微信小程序生成自定义参数二维码 前言实现尾巴 前言 最近项目中要用到二维码分享功能&#xff0c;需要封装一些自定义的参数通过二维码分享。查看官方文档&#xff0c;发现系统提供了生成二维码的功能&#xff0c;但是细看才发现官方提供的接口其实是生成小程序二维码&#xf…

微信小程序内,生成自定义二维码

最近在开发中&#xff0c;需要生成自定义的二维码&#xff0c;于是做了一个包出来&#xff0c;分享给大家一起使用。适用于微信小程序的二维码生成器&#xff0c;基于Canvas生成&#xff0c;支持中文的输入。可在原生小程序&#xff0c;mpvue&#xff0c;taro中使用。&#xff…

微信小程序实战教程1503---生成二维码

在微信小程序中&#xff0c;如果我们可以自己将指定内容生成二维码&#xff0c;出示给别人&#xff0c;将是一个比较有用的功能。但是微信小程序API中&#xff0c;目前暂时还没有这个功能&#xff0c;但是我们可以通过变通的方法&#xff0c;来实现这一功能。 本文所提到的方法…

记一次 Android 源码编译刷机过程

0 背景 为了能在开发设备上运行 adb root 命令得到 root 权限&#xff0c;获得更加强大的调试能力、开发体验&#xff0c;方便以后阅读源码时 Debug 跟踪、进行定制化开发&#xff0c;需要编译 Android 源码 userdebug 版本并刷入手机当中。 1 准备 1.1 硬盘 首先 Android 源…

JavaScript 基础 DOM (四)

正则表达式正则表达式 正则基本使用 定义规则 const reg /表达式/其中/ /是正则表达式字面量正则表达式也是对象 使用正则 test()方法 用来查看正则表达式与指定的字符串是否匹配 如果正则表达式与指定的字符串匹配 &#xff0c;返回true&#xff0c;否则false reg.test(…

苹果id怎么注册?老果粉教你创建新的Apple ID

苹果ID怎么注册&#xff1f;苹果ID又叫做Apple ID&#xff0c;这是我们用来访问Apple服务的账号&#xff0c;包括iCloud、App Store在内的苹果手机自带应用都需要我们登陆Apple ID才可以正常使用。该账号不仅仅只是一个登录账号&#xff0c;其中包含了我们大量的隐私信息&#…

如何重新设置苹果id密码_ios游戏apple账号分享韩国苹果id密码大全

韩区id申请注册流程和在国内申请注册账号流程不一样&#xff0c;所选地区和填写信息要求不一样&#xff0c;现在很多游戏或者其他软件只能在日本地区发行&#xff0c;想要下载这些软件就必须要注册日本地区的id账号就能下载。 申请注册韩区id除了要注意选择地区之外&#xff0c…

苹果注册会员账号

下面介绍个人开发者账号申请流程 1.1首先打开苹果开发者中心 如果已经注册过apple id&#xff0c;跳过注册&#xff0c;直接看后面步骤登录开发者中心申请&#xff01; 点击立即创建您的apple id 2、跳转到apple id申请页面填写相关信息 名字用汉字或者拼音写上去&#xff08;注…