前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JVM内存模型

JVM内存模型

原创
作者头像
零卡
发布于 2022-04-03 08:12:36
发布于 2022-04-03 08:12:36
3240
举报
文章被收录于专栏:零卡零卡

0x01:程序计数器(Program Counter Register)

程序计数器(Program Counter Register)是一块较小的内存空间,是当前线程所执行的字节码的行号指示器。

虚拟机概念模型里(概念模型,各种虚拟机可能会通过一些更高效的方式实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令:分支、跳转、循环、异常处理、线程恢复等基础操作都会依赖这个计数器来完成。

每个线程都有独立的程序计数器,用来在线程切换后能恢复到正确的执行位置,各条线程之间的计数器互不影响,独立存储。所以它是一个“线程私有”的内存区域。此内存区域是唯一一个在JVM规范中没有规定任何OutOfMemoryError情况的区域。

0x02:虚拟机栈(VM Stack)

JVM栈是线程私有的内存区域。它描述的是java方法执行的内存模型,每个方法执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

每个方法从调用直至完成的过程,都对应着一个栈帧从入栈到出栈的过程。每当一个方法执行完成时,该栈帧就会弹出栈帧的元素作为这个方法的返回值,并且清除这个栈帧,Java栈的栈顶的栈帧就是当前正在执行的活动栈,也就是当前正在执行的方法。就像是组成动画的一帧一帧的图片,方法的调用过程也是由栈帧切换来产生结果。

局部变量表存放了编译器可知的各种基本数据类型(int、short、byte、char、double、float、long、boolean)、对象引用(reference类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)和returnAddress类型(指向了一跳字节码指令的地址)。

在JVM规范中,对这个区域规定了两种异常情况:如果线程请求的栈深度大于虚拟机允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展,在扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。

0x03:本地方法栈( Native Method Stack)

本地方法栈和虚拟机栈所发挥的作用是很相似的

它们之间的区别在于虚拟机栈为虚拟机执行Java方法(字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。

0x04:堆(Heap)

Heap是OOM故障最主要的发源地,它存储着几乎所有的实例对象,堆由垃圾收集器自动回收,堆区由各子线程共享使用;通常情况下,它占用的空间是所有内存区域中最大的,但如果无节制地创建大量对象,也容易消耗完所有的空间;堆的内存空间既可以固定大小,也可运行时动态地调整,通过参数-Xms设定初始值、-Xmx设定最大值。

0x05:方法区(Method Area)

方法区是被所有线程共享的内存区域,用来存储已被虚拟机加载的类信息、常量、静态变量、JIT(just in time,即时编译技术)编译后的代码等数据。运行时常量池是方法区的一部分,用于存放编译期间生成的各种字面常量和符号引用。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
sqlite3的C语言使用(一)
前一天我讲了如何在VC中连接sqlite的库,从今天开始就分几个专题详细学习一下sqlite的一些API。当然我也是才接触sqlite3,这些题也都是我的作业题,如果有什么错误大家可以联系我,共同进步。
phith0n
2020/10/15
3.3K0
玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数
SQLite是一个跨平台的轻量级数据库,支持C/C++开发,可用于嵌入式中,关于C/C++使用SQLite的简单实例,之前这篇文章,已经介绍过一种简单的使用方式。本篇来介绍另一种更加高效的调用方式。
xxpcb
2022/12/29
1.8K0
ios在SQLite3基本操作
首先是设置项目文件。在项目中加入iPhone版的sqlite3的数据库的开发包。在项目下的Frameworks点击右键。然后选择libsqlite3.0.dylib文件。
全栈程序员站长
2022/07/05
7740
Sqlite3详细解读
"代码下载:SQLite3_2013_0402详细版.zip" http://vdisk.weibo.com/s/Gb9Qi
py3study
2020/01/07
3.9K0
iOS开发之SQLite--C语言接口规范(三)——Binding Values To Prepared Statements
  在前面的博客中已经介绍了如何连接SQLite数据库,并且简单的查询和遍历结果集。在前面用到了sqlite3_stmt *stmt,也就是预编译后的SQL语句。在本篇博客中会了解一下sqlite3_stmt,然后了解一下变量的绑定。变量绑定,简单的说就是往预编译后的SQL语句中传入相应的值。   一. sqlite3_stmt 的生命周期   这个对象的实例代表着一个被编译成二进制的SQL语句。每个SQL语句都必须经过预编译转换成sqlite3_stmt才能被执行。在iOS开发中,Application或
lizelu
2018/01/11
1.3K0
iOS开发之SQLite--C语言接口规范(三)——Binding Values To Prepared Statements
SQLite3使用笔记(1)——查询
SQLite是一个嵌入式SQL数据库引擎。与大多数其他 SQL 数据库不同,SQLite 没有单独的服务器进程。SQLite 直接读写普通磁盘文件。具有多个表、索引、触发器和视图的完整SQL数据库包含在单个磁盘文件中。
charlee44
2022/05/23
1.5K0
如何优化 SQLite 每秒的插入操作
SQLite 的优化比较棘手,就批量插入而言,其速度可以从每秒 85 条优化到每秒 96,000 条。下面我们来具体看下实验过程和结果,
ClearSeve
2022/02/10
3.5K0
SQLite3使用笔记(2)——插入
如同上一篇文章SQLite3使用笔记(1)——查询所述,使用SQLite进行查询操作同样有两种方式。对于比较简单的表格插入,使用sqlite3_exec()接口就可以了:
charlee44
2022/05/23
6800
【IOS开发基础系列】数据持久化专题
iOS中可以有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Data。
江中散人_Jun
2023/10/16
4040
【IOS开发基础系列】数据持久化专题
iOS原生sqlite3框架操作数据库
iOS开发的基本上都知道fmdb,自从用了fmdb之后都忘记了原生的sqlite3操作了(fmdb太好用了)。 SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置。 SQLite是一个轻量级的关系数据库。SQLite最初的设计目标是用于嵌入式系统,TA占用资源非常少,在嵌入式设备中,只需要几百K的内存就够了,目前应用于Android、iOS、Windows Phone等智能手机。 需要注
傅_hc
2018/07/04
1.3K0
Sqlite数据库使用简介以Windows下简单的引入数据库到C++项目为例
SQLite 是一个开源的嵌入式关系型数据库管理系统。它不是作为一个独立进程运行的服务,而是作为一个库直接链接到应用程序中。这意味着使用 SQLite 的应用程序可以随身携带其数据库,并且可以在不需要单独服务器管理的情况下操作数据。
晨星成焰
2024/08/02
5701
Sqlite数据库使用简介以Windows下简单的引入数据库到C++项目为例
iOS开发之SQLite-C语言接口规范(二) —— Prepared Your SQL Statements
  在《SQLite的C语言接口规范(一)》中介绍了如何去连接打开数据库,本篇博客就介绍如何操作数据库,本篇主要给出了如何执行数据库查询语句(Select), 然后遍历结果集。本篇博客就直接使用上一篇博客封装的打开数据库的方法获取到数据库的操作句柄,然后通过这个句柄来操作我们的Sqlite数据库。今天这篇博客中要多Cars.sqlite数据库中的其中一个表进行Select操作。更为细节的东西请参考SQLite官网:http://www.sqlite.org 。   一.预编译SQL语句     要想执行一条
lizelu
2018/01/11
1.1K0
iOS开发之SQLite-C语言接口规范(二) —— Prepared Your SQL Statements
使用iOS原生sqlite3框架对sqlite数据库进行操作
      sqlite数据库是一种小型数据库,由于其小巧与简洁,在移动开发领域应用深广,sqlite数据库有一套完备的sqlite语句进行管理操作,一些常用的语句和可视化的开发工具在上篇博客中有介绍,地址如下:
珲少
2018/08/15
2.2K0
使用iOS原生sqlite3框架对sqlite数据库进行操作
swift 简易操作sqlite3 之 通用查询
上篇文章我们写了关于SQLite的简单操作和一些基本常识,对此陌生的童鞋可以参考之前的文章(swift简易操作sqlite3),今天我们在此基础上进一步加工处理,写出通用查询操作方法
大话swift
2019/07/03
1.5K0
swift 简易操作sqlite3 之 通用查询
Sqlite 接口封装(c++)
Freedom123
2024/03/29
2880
C/C++ 通过SQLiteSDK增删改查
SQLite,作为一款嵌入式关系型数据库管理系统,一直以其轻量级、零配置以及跨平台等特性而备受青睐。不同于传统的数据库系统,SQLite是一个库,直接与应用程序一同编译和链接,无需单独的数据库服务器进程,实现了数据库的零配置管理。这种设计理念使得SQLite成为许多嵌入式系统、移动应用和小型项目中的首选数据库引擎。
王瑞MVP
2023/11/26
4750
C/C++ 通过SQLiteSDK增删改查
Sqlite 读写blob数据(c++)
参考:https://www.cnblogs.com/wengzilin/archive/2012/03/28/2420796.html
Freedom123
2024/03/29
3020
SQLite3 Cpp基本使用
文章目录 SQLite3 C++ #0 GitHub #1 环境 #2 安装sqlite3 #3 使用 #3.1 基本SQL语句 #3.2 sqlite3 API #3.3 Code SQLite3 C++ 0 GitHub example代码 SQLite3 C++ Demo Github 1 环境 macOS C++14 2 安装sqlite3 git clone https://github.com/sqlite/sqlite.git cd sqlite && mkdir bld && cd bld
Autooooooo
2021/12/07
1.3K0
SQLite3 Cpp基本使用
学习iPhone开发中 sqlite3的
    由于我主要负责我们小组项目数据库模块的部分所以这几天都一直在研究在iphone中最为常用的一个简单数据库sqlite,自己也搜集很多资料,因此在这里总结一下这几天的学习成果:
py3study
2020/01/08
9930
C++编程库与框架实战——SQLite3数据库引擎
SQLite是可以实现类似于关系型数据库中各种操作的事务性SQL数据库引擎,可以为应用程序提供存储于本地的嵌入式数据库,帮助应用程序实现轻量级的数据存储。
Coder-ZZ
2024/06/06
1.3K0
C++编程库与框架实战——SQLite3数据库引擎
推荐阅读
相关推荐
sqlite3的C语言使用(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档