JVM 内存模型

news2024/11/15 10:04:20
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.coloradmin.cn/o/1421867.html

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

相关文章

【Python机器学习系列】建立LightGBM模型预测心脏疾病(完整实现过程)

一、引言 前文回顾: 一文彻底搞懂机器学习中的归一化与反归一化问题 【Python机器学习系列】一文彻底搞懂机器学习中表格数据的输入形式(理论源码) 【Python机器学习系列】一文带你了解机器学习中的Pipeline管道机制(理论源码…

如何一键导出多张图片二维码?图片批量建码生成的方法

现在很多的物品信息都会生成一张单独的图片,然后生成二维码印刷到包装或者其他地方上使用,那么如何快速将多张图片多批量生码处理,相信有很多的小伙伴都不太清楚该怎么完成。其实,大量图片生成二维码的方法是很简单的,…

MySQL默认的连接数151如何修改

在MySQL中修改 max_connections 的值可以通过以下几种方法进行: 1. 临时修改 可以通过MySQL命令行临时修改 max_connections 的值。这种修改直到下次MySQL服务重启时才会失效。要进行临时修改,可以使用以下命令: SET GLOBAL max_connectio…

聊聊DoIP吧

DoIP是啥? DoIP代表"Diagnostic over Internet Protocol",即互联网诊断协议。它是一种用于在车辆诊断中进行通信的网络协议。DoIP的目标是在现代汽车中实现高效的诊断和通信。通过使用互联网协议(IP)作为通信基础,DoIP使得诊断信息能够通过网络进行传输,从而提…

【Go】微服务架构下实现etcd服务注册与服务发现

中心网关:gateway 四个微服务:user、message、note、relationship 1 中心网关实现服务发现 1.1 设计EtcdDiscovery类 package entityimport ("context""fmt"clientv3 "go.etcd.io/etcd/client/v3""gonote/gatewa…

C#,斐波那契数列(Fibonacci Sequence)的八种算法与源代码

一、莱昂纳多斐波那契(Leonardo Fibonacci) 斐波那契公元1170年生于意大利比萨,卒于1250年,被人称作“比萨的莱昂纳多”,是一名闻名于欧洲的数学家,其主要的著作有《算盘书》、《实用几何》和《四艺经》等。…

Github 2024-01-31 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-01-31统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5非开发语言项目3TypeScript项目1Jupyter Notebook项目1C项目1 基于项目的学习 创建周期&#xf…

SAP下载word

事务代码:STRANS 启动转换器 步骤 1. 将参数填入模板,并另存为word 2003 xml文档 2.使用网页打开xml文档,并将xml拷贝到转换器tt:template中,添加参数 3.替换参数,部分xml可能存在错误或者跑偏根据实际情况检查修改 …

WPF应用程序(.Net Framework 4.8) 国际化

1、新建两个资源字典文件zh-CN.xaml和en-US.xaml&#xff0c;分别存储中文模板和英文模板 (1) zh-CN.xaml <ResourceDictionary xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml&q…

数字孪生智慧能源电力Web3D可视化云平台合集

前言 能源电力的经济发展是中国式现代化的强大动力&#xff0c;是经济社会发展的必要生产要素&#xff0c;电力成本变化直接关系到工业生产、交通运输、农业生产、居民生活等各个方面&#xff0c;合理、经济的能源成本能够促进社会用能服务水平提升、支撑区域产业发展&#xf…

xcode安装visionOS Simulator模拟器报错解决方法手动安装方法

手动安装方法&#xff1a; 手动下载visionOS Simulator模拟器地址&#xff1a; https://developer.apple.com/download/all/ 选择 Xcode 版本 sudo xcode-select -s /Applications/Xcode.app # 用 Xcode-beta 的话是&#xff1a; # xcode-select -s /Applications/Xcode-beta…

Cache Lab:Part A【模拟出使用LRU策略的高速缓存存储器组织结构】

目录 任务描述 知识回顾 实验内容 测试结果 Cache Lab 对应《CS:APP》6.3节至第六章结束的内容。 任务描述 Your job for Part A is to fill in the csim.c file so that it takes the same command line arguments and produces the identical output as the reference …

WAP在线封装APP工具:革新移动体验的技术

一、融合式设计&#xff1a;打破原生与网页应用的界限WAP封装App工具的最新版本已经能够实现无缝融合网页内容与原生应用功能。这些工具不仅仅是简单地将网页“包装”成APP&#xff0c;而是通过创新的融合式设计&#xff0c;让用户在使用过程中几乎感受不到两者之间的差异。例如…

Ruff应用:打破传统,IoT技术赋能工业制造数字化转型之路

近年来&#xff0c;随着物联网、大数据、云计算、5G等数字技术的快速应用&#xff0c;工业制造领域正在经历着前所未有的变革。工业4.0时代&#xff0c;各种数字技术与工业制造的结合&#xff0c;不仅提高了工业生产效率、降低运营成本&#xff0c;更是极大地推动了传统工业数字…

【深度学习每日小知识】Model Accuracy 模型准确率

Model Accuracy 模型准确率 模型准确性是衡量机器学习 (ML) 模型基于数据做出预测或决策的能力的指标。它是用于评估 ML 模型性能的常用指标&#xff0c;可用于比较不同模型的性能或评估特定模型对于给定任务的有效性。 有多种不同的方法来衡量模型的准确性&#xff0c;具体取…

Mac下手动源码编译安装Swig

使用Homebrew安装 这个方式最简单&#xff0c;但是一般都是安装的最新版&#xff1a; brew install swig如果按照特定版本&#xff0c;需要看一个当前支持的列表&#xff1a; brew search swig brew install swig3源码编译安装 swig依赖pcre库&#xff0c;需要先安装pcre …

Inventor 2024下载安装教程,免费使用,附安装包和工具,流程简单,小白也能轻松搞定

前言 Inventor是一款专业的三维可视化实体建模软件&#xff0c;Inventor.主要用于各类二维机械制图、三维制图的设计和开发等操作&#xff0c;可以广泛地应用于零件设计、钣金设计、装配设计等领域。 准备工作 1、Win7及以上系统 2、提前准备好 Inventor 2024 安装包 没有…

C# 多线程(2)——线程同步

目录 1 线程不安全2 线程同步方式2.1 简单的阻塞方法2.2 锁2.2.1 Lock使用2.2.2 互斥体Mutex2.2.3 信号量Semaphore2.2.3 轻量级信号量SemaphoreSlim2.2.4 读写锁ReaderWriterLockSlim 2.3 信号同步2.3.1 AutoResetEvent2.3.1.1 AutoResetEvent实现双向信号 2.3.2 ManualResetE…

H2数据库学习总结

H2数据库-简介 H2 是开源的轻量级Java数据库。它可以嵌入Java应用程序中或以客户端-服务器模式运行。 H2 数据库主要可以配置为作为内存数据库运行&#xff0c;这意味着数据将不会持久存储在磁盘上。 由于具有嵌入式数据库&#xff0c;因此它不用于生产开发&#xff0c;而主要…

【Java程序设计】【C00184】基于SSM的旅游网站管理系统(论文+PPT)

基于SSM的旅游网站管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的旅游网站管理系统 本系统分为前台用户、后台管理员2个功能模块。 前台用户&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的就是首…