JVM 内存模型

1 什么是 JVM 内存模型
JVM 需要使用计算机的内存,Java 程序运行中所处理的对象或者算法都会使用 JVM 的内
存空间,JVM 将内存区划分为 5 块,这样的结构称之为 JVM 内存模型。
2 JVM 为什么进行内存区域划分
随着对象数量的增加, JVM 内存使用率也在增加,如果 JVM 内存使用率达到 100%,
则无法继续运行程序。为了让 JVM 内存可以被重复使用,我们需要进行垃圾回收。为了提
高垃圾回收的效率,JVM 将内存区域进行了划分。
3 JVM 内存划分
JVM 按照线程是否共享将内存首先分成两大类。
线程独享区
只有当前线程能访问数据的区域,线程之间不能共享;
线程独享区随线程的创建而创建,随线程的销毁而被回收。
线程共享区
所有线程都可以访问的区域,
当线程被销毁的时候,共享区的数据不会立即回收,需要等待达到垃圾回收的阈(yu)
值之后才会进行回收。
4 程序计数器
程序计数器会记录当前线程要执行指令的内存地址,只占用一小部分内存区域,只记录一个
地址,所以我们认为程序计数器是不会出现内存溢出问题的分区。
5 本地方法栈
Java 中有些代码的实现是依赖于其他非 Java 语言的(C++), 本地方法栈存储的是 维护
非 Java 语句执行过程中产生的数据,一般我们认为本地方法栈不会出现内存的问题。
6 虚拟机栈
6.1 虚拟机栈的作用
存放当前线程中所声明的变量,包括基本数据类型的数据和引用数据类型的引用。
基本数据类型和引用数据类型划分的标准:
1.基本数据类型:
变量在声明的时候,能够确认占用内存的大小。
2.引用数据类型:
变量在声明的时候,不能确认占用内存的大小。
引用数据类型将值的引用存放到虚拟机栈中,而对象存放在堆内存中,引用数据类型占用 4
个字节存放地址。
6.2 栈帧
每一个线程都会对应一个虚拟机栈,线程中的每个方法都会创建一个栈帧,存放本次方法执
行过程中所需要的所有数据。
如果我们一个线程中有多个方法的嵌套调用,虚拟机栈会对栈帧进行压栈和出栈操作。正在
执行的方法一定在栈顶,我们只能获取栈顶的栈帧,栈帧在虚拟机栈中先进后出。
6.3 栈帧的数据结构
局部变量
存放当前方法的局部变量,基本数据类型存值,引用数据类型存堆内存地址。
操作数栈
对方法中的变量提供计算的区域。
常量数据的引用
常量数据会存放到方法区的常量池中,不管是基本数据类型还是引用数据类型都会存放常量池的地址。
方法返回值的地址
方法返回数据会存到计算机内存的寄存器中。
6.4 虚拟机栈溢出异常
由于栈帧调用的深度太深,会出现 虚拟机栈溢出异常(SOF 异常)。 一般手动方法的调用
是不会出现这个异常的,如果出现这个异常 ,99%是由于递归。
可以通过修改虚拟机栈的内存大小设置栈帧的最大深度,指令为:
9 -Xss 虚拟机栈内存大小
一般栈帧深度达到 3000~5000 即可
太小:虚拟机栈容易溢出。
太大:每个线程占据的内存过大,影响线程数量。
7 方法区
在 java8 之后,我们把方法区称之为元空间(MetaSpace),方法区在逻辑上属于堆
的一部分,但一些具体机制和堆有所区别,如:一些 JVM 的方法区是可以不进行垃圾回收
的,关闭 JVM 时才会释放方法区内存。所以方法区还有一个别名叫非堆,目的是和堆分开。
方法区会存储类信息、静态变量、常量(JDK8 之后不存放字符串常量)、本地机器指令。
如果加载大量 class 文件,也会造成方法区内存溢出,如一个 tomcat 运行 20~30 个项目。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“减半倒数80天”!比特币18个月后将飙涨四倍!但多数矿企短期面临亏损?

随着比特币现货ETF的顺利推出,比特币的另一个潜在的催化剂就是即将到来的第四次减半。据Bitcoin Block Half最新数据,目前距离比特币减半仅剩余约80天,预计将在今年4月22日发生,届时,每个区块的比特币奖励将从当前的6.…

常见分类网络的结构

VGG16 图片来自这里 MobilenetV3 small和large版本参数,图片来着这里 Resnet 图片来自这里

PCB设计10条重要布线原则(学习笔记)

文章目录 一、连线精简二、避免走直角线三、差分走线四、蛇形走线五、圆滑走线六、数字与模拟分开七、3W原则八、20H原则九、铜箔承载电流十、过孔承载电流 一、连线精简 尽量用最短的路径去布线 1、可以省资源 2、信号差损少 3、线能不拐弯就不拐弯 4、能不换层就不换层 二…

Modern C++ std::get<n>(tuple)的原理

1. 前言 前面我们讲过std::tuple的实现原理,但没有讲如何取出数据,本节着重讲讲这点。本节与之前的blog有较大关联,如果您没看,这里有链接,链接已按由浅入深排好序,您可以按顺序阅读。如果时间少可以直接看…

[工具探索]Safari 和 Google Chrome 浏览器内核差异

最近有些Vue3的项目,使用了safari进行测试环境搞开发,发现页面存在不同程序的页面乱码情况,反而google浏览器没问题,下面我们就对比下他们之间的差异点: 日常开发google chrome占多数;现在主流浏览器 Goog…

【零基础学习CAPL】——CAN报文的发送(配合Panel面板单次发送)

🙋‍♂️【零基础学习CAPL】系列💁‍♂️点击跳转 文章目录 1.概述2.面板创建2.1.新建一个Panel2.2. 在Panel中调出控件窗口2.3.控件添加与配置 3.系统变量创建4.系统变量与Panel绑定5.CAPL脚本实现6.效果 1.概述 使用场景,按下面板按钮同时…

存内计算——助力实现28nm等效7nm功效

算力是数字经济时代的核心生产力,并且近年来需求剧增。而我国当前的算力供给上仍面临巨大的挑战,一方面,国外的高端算力芯片被美国禁售,另一方面,国内的芯片产业仍处于发展阶段[1]。如何获取算力提升,成为当…

力扣hot100 买卖股票的最佳时机 贪心 经典题

Problem: 121. 买卖股票的最佳时机 文章目录 思路复杂度Code 思路 假设今天卖出,那怎么样收益最大呢?之前买入价是最低的 复杂度 ⏰ 时间复杂度: : O ( n ) O(n) O(n) 🌎 空间复杂度: O ( 1 ) O(1) O(1) Code class Solut…

跟着pink老师前端入门教程-day14+15

2.6 main 主体模块制作 HTML&#xff1a; <div class"w"><div class"main"><!-- 焦点图模块 --><div class"focus"><ul><li><img src"./images/banner_bg.png" alt""></li>…

springboot中获取配置文件中属性值的几种方式

目录 第一章、使用Value注解第二章、使用PropertySource注解第三章、使用Configurationproperties注解第四章、使用Java Properties类第五章、使用Environment接口 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置…

SpringBoot+Vue的商城系统

技术选型 开发工具&#xff1a;IntelliJ IDEA2020.3 运行环境&#xff1a;jdk8mysqlmavennodejs 服务端&#xff1a;SpringBootmybatis-plus 前端&#xff1a;VueaxiosElement-UIvuex 成果展示

Node.js Express 框架 2024版 笔记

1.0 操作命令 Node.js express 框架 https://www.expressjs.com.cn/ npm install -g express-generator expressexpress --pug --git // --pug 添加对 pug 模板引擎的支持 // --git 添加 .gitignore 代码仓库排除 //无法直接安装新版pug模板 npm i npm …