java 内存模型

程序计数器

  1. 线程私有
  2. 主要字节码解释器通过读取程序计数器来选取下一条需要执行的指令,比如分支,循环,跳转和异常处理
  3. 如果执行的是java 方法,那么程序计数器记录的时候虚拟机字节码指令的地址,如果执行的是native 方法,那么是计数器的值为空,
  4. 这个区域不会发生OOM。

虚拟机栈

  1. 线程私有
  2. 每个方法在执行是都会创建栈帧,用于存放局部变量,操作数栈,动态链接和方法出口
  3. 存放了编译时期可知的各种基本数据类型,对象引用, 和returnAddress 类型(指向了一条字节码指令的地址),其中long 和double 占用两个局部变量空间,其余类型占用一个,局部变量所需的空间再编译期完成分配,当进入一个方法时,分配多大的局部变量是已经确定的,不会改变局部变量的大小
  4. 如果线程请求的栈深度大于虚拟机允许深度,会抛出stackOverFlow 异常;如果虚拟机栈可以动态扩展,但是无法申请到足够的内存,那么将抛出outOfMemory 异常

本地方法栈

  1. 和虚拟机栈的功能类似,不同点主要是为虚拟机的native 方法服务。hotSpot 虚拟机直接把本地方法栈和虚拟机栈合二为一。
  2. 参数设置
    1. -xss 每个线程的栈大小,1.5+ 的每个线程栈大小为1M

Java堆

  1. 线程共享
  2. 主要存放对象实例,是java 内存收集器管理的主要区域,可以分为新生代和老年代。新生代又可以分为eden 区、from Survior区域和to Survior 区域。
  3. 参数设置
    1. -Xms 最小堆内存
    2. -Xmx 最大堆内存
    3. -XX NewSize 设置新生代最小空间大小
    4. -XX MaxNewSize 设置新生代最大空间大小
    5. -XX NewRatio 新生代和老年代的比例,比如NewRatio=2 ,那么新生代占2/3,老年代占1/3
    6. -XX SurviorRatio 新生代中eden 和survior 的比例,默认值为8

方法区(永久代)

  1. 线程共享
  2. 已经被虚拟机加载的存储类信息、常量、静态变量。
  3. 不同的虚拟机的不同方法区有不同的实现,hotSpot 方法区在1.7 前后发生了变化
    1. jdk1.7 版本把原本放在方法区的字符串常量放在了java 堆中;
    2. jdk8 则把永久代给删除了,取而代之的是metaSpace

  1. 参数设置
    1. -XX PermSize 设置永久代的最小空间大小
    2. -XX MaxPermSize 设置永久代最大空间大小

运行时常量池

  1. 是方法区的一部分
  2. 运行时常量池相对于Class文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中,这种特性被开发人员利用得比较多的便是String类的intern()方法。

metaSpace

  1. 1.8 版本之后取代了永久代,因此元空间回收不是传统的垃圾回收过程中进行的
  2. 元空间的内存管理是通过对类和元数据的加载、卸载和转移来实现的。当类或元数据不再被使用时,会被标记为可卸载状态,并等待垃圾回收器执行卸载操作。元空间的回收是通过类和元数据的卸载来实现的,这些操作通常由JVM的类卸载器或元数据卸载器来执行。
  3. 为啥要用元空间替换永久代
    1. 动态分配内存:元空间的内存是在堆外分配的,并且可以动态调整大小,因此可以更好地适应应用程序的需要。
    2. 元空间的内存使用效率更高:元空间的实现方式不需要使用传统的对象引用,而是使用指针或其他方式来表示类和元数据,因此可以更有效地利用内存。
    3. 更易于调优:元空间的大小可以通过命令行参数或JVM启动参数进行设置和调整,而永久代的大小无法动态调整。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【FreeRTOS】任务管理

一、任务管理介绍 1.任务状态 1)调度器切换任务调度 2)任务是一个死循环,如果想要停止这个任务则会调用在函数最后写的delete函数进行自杀 1.就绪态 1)已经具备执行的能力,只等待调度器进行调度。 2)新创建…

Linux系统前后端分离项目

目录 一.jdk安装 二.tomcat安装 三.MySQL安装 四.nginx安装 五.Nginx负载均衡tomcat 六.前端部署 一.jdk安装 1. 上传jdk安装包 jdk-8u151-linux-x64.tar.gz 进入opt目录,将安装包拖进去 2. 解压安装包 这里需要解压到usr/local目录下,在这里新建一个…

python程序设计基础:异常处理结构与程序调试、测试

第八章:异常处理结构与程序调试、测试 简单地说,异常是指程序运行时引发的错误,引发错误的原因有很多例如除零、下标越界、文件不存在、网络异常、类型错误、名字错误、字典键错误、磁盘空间不足,等等。 如果这些错误得不到正确的处理将会导致程序终止运行,而合理…

HuggingFists系统功能介绍(1)--系统概述

HuggingFists是一款低代码AI应用工具,力图发展为LangChain的低代码平替工具。HuggingFists发起于数由科技的Sengee数据科学计算框架,因此其界面风格继承了数据科学工具的很多特征。有别于完全基于LangChain衍生出的低代码工具Flowise,其风格更…

YOLO如何训练自己的模型

目录 步骤 一、打标签 二、数据集 三、跑train代码出模型 四、跑detect代码出结果 五、详细操作 步骤 一、打标签 (1)在终端 pip install labelimg (2)在终端输入labelimg打开 如何打标签: 推荐文章&#xf…

2.23 Day05

#include "mywidget.h" #include "ui_mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget) {ui->setupUi(this);//居中ui->label02->setAlignment(Qt::AlignCenter);ui->Edit1->setAlignment(Qt::Alig…

协程源码 launch 流程跟踪学习

为了更深入学习协程的底层实现原理,了解协程线程切换的根本本质。也为了以后在工作中可以根据不同的需求场景,更加随心所欲的使用不同的协程。 今天通过 launch 跟踪一下协程的执行流程。 fun getData() {Trace.beginSection("getData");Log.…

knife4j springboot3使用

简介 在日常开发中,写接口文档是我们必不可少的,而Knife4j就是一个接口文档工具,可以看作是Swagger的升级版,但是界面比Swagger更好看,功能更丰富 使用 我使用的是springboot3.2.3 knife4j 4.3.0,knife4j 4.4版本有…

RK3568平台开发系列讲解(Linux系统篇)字符设备驱动:主设备和次设备

🚀返回专栏总目录 文章目录 一、主设备和次设备的概念二、设备号的分配和释放沉淀、分享、成长,让自己和他人都能有所收获!😄 字符设备通过字符(一个接一个的字符)以流方式向用户程序传递数据,就像串行端口那样。字符设备驱动通过/dev目录下的特殊文件公开设备的属性和…

dolphinscheduler单机版部署教程

文章目录 前言一、安装准备1. 安装条件2. 安装jdk3. 安装MySQL 二、安装dolphinscheduler1. 下载并解压dolphinscheduler2. 修改配置文件2.1 修改 dolphinscheduler_env.sh 文件2.2 修改 application.yaml 文件 3. 配置mysql数据源3.1 修改MySQL安全策略3.2 查看数据库3.3 创建…

UE5 文字游戏(1) 仅UI截图转换为texture2d(适用于window端)

目录 需求 思路 1.截图并读取到本地 2.本地读取图片并转换为纹理2d 效果展示 找了好多的解决办法,都不管用。这个算是折中的。 需求 将当前的用户控件(ui)截图下来,并赋值到一个texture2d上。 我的需求:文字游戏…

golang通过http访问外部网址

不同项目之前,通过http访问,进行数据沟通 先设定一个接口,确认外部能访问到 PHP写一个接口 public function ceshi_return() {$data $this->request->param();$id $data[id];$res Db::name(user)->field(id,status,price,name)->where([id>$id])->find…

抖音视频抓取软件的优势|视频评论内容提取器|批量视频下载

抖音视频抓取软件在市场上的优势明显: 功能强大:我们的软件支持关键词搜索抓取和分享链接单一视频提取两种方式,满足用户不同的需求。同时,支持批量处理数据,提高用户获取视频的效率。 操作简单:我们的软件…

matlab|计及源荷不确定性的综合能源生产单元运行调度与容量配置随机优化模型

目录 1 主要内容 1.1 风光场景聚类 1.2 主模型程序结果 1.3 随机模型和确定性模型对比 1.4 有无储气对比 1.5 煤价灵敏性分析 1.6 甲烷价格灵敏性分析 2 部分程序 3 下载链接 1 主要内容 本程序复现《计及源荷不确定性的综合能源生产单元运行调度与容量配置两阶段随机…

OpenGL ES (OpenGL) Compute Shader 计算着色器是怎么用的?

OpenGL ES (OpenGL) Compute Shader 是怎么用的? Compute Shader 是 OpenGL ES(以及 OpenGL )中的一种 Shader 程序类型,用于在GPU上执行通用计算任务。与传统的顶点着色器和片段着色器不同,Compute Shader 被设计用于在 GPU 上执行各种通用计算任务,而不是仅仅处理图形…

前端导出下载文件后提示无法打开文件

问题 项目中的导出文件功能,导出下载后的文件打开提示如下: 原因 对返回的响应数据进行打印,发现响应数据为字符串格式,前期规划的后端返回数据应该 blob 对象的。后经排查后发现是请求头缺少了响应数据格式的配置,应…

SpringMVC 学习(六)之视图

目录 1 SpringMVC 视图介绍 2 JSP 视图 3 Thymeleaf 视图 4 FreeMarker 视图 5 XSLT 视图 6 请求转发与重定向 6.1 请求转发 (Forward) 6.2 重定向 (Redirect) 7 视图控制器 (view-controller) 1 SpringMVC 视图介绍 在 SpringMVC 框架中,视图可以是一个 J…

Python爬虫实战:图片爬取与保存

引言: 在本文中,我们将学习如何使用Python创建一个简单的图片爬虫。 我们将利用requests库来发送HTTP请求,BeautifulSoup库来解析HTML页面,以及os和shutil库来下载和保存图片。通过这个教程,你将学会如何爬取网…

神经网络2-卷积神经网络一文深度读懂

卷积神经网络(Convolutional Neural Network, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),主要用于图像识别、语音识别和自然语言处理等任务,是深度学习&#xff0…

遗传算法(Genetic Algorithm,GA)求解不闭合多旅行商问题(提供MATLAB代码)

一、遗传算法(GA)介绍 遗传算法(Genetic Algorithm,GA)是一种模拟自然界生物进化过程的优化算法。它通过模拟生物的遗传、变异和选择等机制,来搜索问题的最优解。 遗传算法的基本思想是通过对候选解进行编…