JAVA - 内存管理

news2024/12/22 20:01:02

目录

内存管理是什么

JVM内存区域组成

程序计数器PC

java虚拟机栈

本地方法栈

JAVA堆

方法区

常量池 

运行时常量池


内存管理是什么

Java的内存管理就是对象的分配和释放问题

分配 :内存的分配由程序完成的,程序员通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象都在堆中分配空间

释放 :对象的释放由垃圾回收机制决定和执行

GC需要监控每个对象的运行状态,包括对象的申请、引用、被引用、赋值等

JVM内存区域组成

从逻辑上可将JVM内存分为5个部分,主要分为被所有线程共享的内存区域和仅被当前线程独占的内存区域

线程共享的内存区域包括堆和方法区

线程独占的内存区域包括虚拟机栈,本地方法栈,程序计数器

写程序时,需要判断当前数据读写的是存在于哪类内存区域,如果存在的是线程共享的内存区域,那么就要考虑是否存在线程安全问题,如果存在线程独占的内存区域,就没关系

程序计数器PC

线程私有的内存区域

每个线程都有自己的一个程序计数器,来表示当前线程执行的字节码行号

字节码解释器工作时通过改变程序计数器的值来选取下一条需要执行的字节码指令

如果线程执行的是一个Java方法,计数器记录的是正在执行的虚拟机字节码指令的地址;如果线程执行的是一个Native方法,计数器的值为空

 

java虚拟机栈

线程私有的内存区域

栈以帧为单位保存线程的状态,JVM对栈只进行两种操作:以帧为单位的压栈和出栈操作 

每个方法执行的同时会创建一个栈帧,栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息,每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程

栈帧中存放的局部变量有8种基本数据类型,以及引用类型(对象的内存地址)

当线程请求的栈的深度超出了虚拟机栈允许的深度时,会抛出StackOverFlow的错误

当Java虚拟机动态扩展到无法申请足够内存时会抛出OutOfMemory的错误

public void funcA() {
	int n = 3;
	funcB(n);
}
	
public void funcB(int n) {
	System.out.println("");
}

以上代码运行时,程序会先调用funcA方法,将funcA方法封装成"栈帧”入栈,由于funcA方法中调用了funcB,将funcB方法封装成"栈帧”入栈

先执行B中的逻辑,等于funcB栈帧出栈操作

然后执行A方法,等于funcA栈帧出栈操作 

本地方法栈

线程私有的内存区域

本地方法栈与虚拟机栈的区别:

虚拟机栈为虚拟机执行Java方法服务(也就是字节码),而本地方法栈为虚拟机使用到的Native方法服务

(Native方法:非java语言实现的函数,往往是由C/C++编写的,和操作系统相关性比较强的底层函数)

Java虚拟机规范对这个区域规定了两种异常情况:StackOverflowError 和 OutOfMemoryError异常

JAVA堆

每个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。

应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享

Java堆属于线程共享区域,所有的线程共享这一块内存区域

Java堆的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存

Java堆是垃圾回收器管理的主要区域,从内存回收的角度看,由于现在收集器基本都采用分代收集算法,所以Java堆可以细分为:新生代、老生代

当Java虚拟机动态扩展到无法申请足够内存时会抛出OutOfMemory的错误

Java堆内存的OOM异常:

内存泄露:指程序中一些对象不会被GC所回收,它始终占用内存

内存溢出:程序运行过程中无法申请到足够的内存而导致的一种错误

方法区

线程共享区域

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

Java编译器是javac.exe把Java源文件编译成Java类文件,类加载的第一个阶段叫做“加载”,在这个阶段内,虚拟机将会读取被编译的Class文件生成Class对象,Class对象存储了一些类型信息,这些信息就是存储在方法区内

当方法区无法满足内存分配的需求时,将抛出OutOfMemoryError异常

常量池 

常量池用于存放编译期生成的各种字节码和符号引用

类和类之间是有调用关系的,怎么记录这些调用关系呢,可以通过类似指针的方式,在类A的字节码中留下一个指针,指向想要调用的类B的字节码,这里指针就起到了“链接”的作用

在类加载中,在虚拟机加载字节码的时候,首先加载的就是一些静态的“符号引用”,然后在类加载的“链接”阶段或者说程序运行时将符号引用转化为直接引用

这些符号引用信息就存储在常量池中

运行时常量池

运行时常量池属于方法区的一部分

运行时常量池存储着两大类数据:

1、编译期间产生的字节码中定义的静态信息,比如:

        --字节码生成的Class对象(比如常量池)

        --由字节码生成的字面量(编写代码中所定义的常量自变量)

2、运行期间产生的信息

        --运行时会将一部分符号引用转换为直接引用,将直接引用保存在运行时常量池

        --常见的字符串常量池

 

 

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

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

相关文章

mysql视图的简单应用

1、创建一视图 stu_info,查询全体学生的姓名,性别,课程名,成绩。 create view stu_info(姓名,性别,课程名,成绩) as select Sname,Ssex,Cname,Score from Course,SC,Student where Student.Sno SC.Sno and SC.Cno Course.Cno;去查看视图 …

混合云监控

混合云基础架构的增长是由增强的灵活性、成本优化机会以及对敏捷 DevOps 文化的支持等优势推动的。另一方面,在混合云环境中很难实现可见性、问责制和控制,这被证明是混合云成功的障碍。尽管公共云提供商提供了用于监控服务可用性的控制台,但…

将媒体公司资产迁移到 Amazon S3 的技术方案

随着媒体公司的发展,他们在仓库中积累了大量的旧磁带和未数字化的视频。这些资产可能很有价值,但以目前的形式很难访问和货币化。此外,将这些资产存储在仓库中既有风险又昂贵。 媒体企业可以通过将其资产迁移到云存储来解决这些问题&#xf…

MySQL练习题(5)

创建表并插入数据 1、创建一个可以统计表格内记录条数的存储函数 ,函数名为count_sch() select count_sch() 2、创建一个存储过程avg_sai,有3个参数,分别是deptno,job,接收平均工资, 功能查询emp表dept为30…

开放式蓝牙耳机测评!2023年值得入手的开放式蓝牙耳机都在这里!索尼、南卡、韶音、飞利浦等等品牌,看看有没有适合你的款式!

这可能是站内最详细的开放式蓝牙耳机选购攻略!想入手开放式蓝牙耳机必看! 在这个人人手机不离手的快节奏时代,蓝牙耳机自然是越多越多人的选择,而随着耳机种类的进化代送,开放式蓝牙耳机,也随之被大众熟知…

【面试题39】能够使HTML和PHP分离开使用的模板技术有哪些

文章目录 一、前言二、模板技术的好处三、常用的模板技术3.1 PHP模板引擎3.2 前端模板引擎3.3 前后端分离技术 四、Smarty模板使用演示4.1 在项目中引入Smarty模板引擎的文件4.2 引入Smarty.class.php文件4.3 创建一个Smarty对象4.4 变量定义4.5 创建一个Smarty模板文件4.6 绑定…

无需魔法三分钟上线Midjourney应用,【附源码】【示例】

ps:我是标题党,目前还没见过三分钟完成任务的,三分钟只能打通Midjourney接口。我花了一天时间接入应用哈哈哈! 首先,我要感谢laf赞助我,让我可以免费使用Midjourney进行开发和测试。来自白嫖党的快乐。 其次&#xff…

基于linux下的高并发服务器开发(第一章)- 静态库和动态库的对比1.9

01 / 程序编译成可执行程序的过程 静态库、动态库区别来自链接阶段如何处理,链接成可执行程序。分别称为静态链接方式和动态链接方式。 02 / 静态库的制作过程 03 / 动态库的制作过程 04 / 静态库的优缺点 05 / 动态库的优缺点

[工具推荐] LICEcap 动图gif录制工具 轻量/开源/免费

先声明:不是广子,单纯分享 LICEcap 之前用Windows时,就用这个软件 后来用mac了,发现它也有mac版的,也支持m1芯片的苹果电脑 这是目前用过最轻量的gif录制软件了, 程序整体都不到1mb 该有的功能都有&a…

『表面』无序点云的快速三角化

1、PCL中的贪婪投影三角化(GreedyProjectionTriangulation)算法 该算法用于将无序点云数据转换为表面三角网络模型的表面重建算法。可以根据点云数据中的几何信息,自动构建出具有连续性和平滑性的三角网络模型。 具体步骤: 预处…

马斯克在与创业公司OpenAI竞争的新竞标中公布了xAI

北京时间7月13日凌晨,马斯克在Twiiter上毫无预警地宣布:“xAI正式成立,去了解现实。”(Announcing formation of xAI to understand reality.)这是马斯克首次官宣xAI的进展。 xAI的Twitter账号中目前还没有多少内容&a…

嵌入式Linux开发实操(四):pinctrl和dt_binding

Linux/pinctrl subsystem,统一了各SOC/MCU厂商的PIN引脚管理了吗? pin命名遵循IC spec上的命名。它是如何实现驱动到硬件的对接的呢?在CPU、Memory等完成初始化加载之后,显然就进入到了嵌入式linux的核心部分,管理对接硬件,这正是pinctrl要完成的工作。 Linuxpinctrl架构…

el-date-picker 日期时间进行限制,精确到时分秒

需求:用户只能选择当时时间或当前时间之前的时间,且精确到时分秒 实现效果:用户只能选择当前时间的时间,如果选择是当天之前的时间,时分秒不做限制,如果选择的是当天时间,就要判断时分秒&#…

Stable Diffusion 丝滑无闪烁AI动画 Temporalkit+Ebsynth+Controlnet

早期的EbSynth制作的AI视频闪烁能闪瞎人的双眼,可以通过【temporalkit+ebsynth+controlnet】让视频变得丝滑不闪烁。 文章目录 插件准备丝滑视频制作插件准备 下载安装 EbSynth官网,这里需要输入email地址。 下载压缩包解压缩到任意位置,这里我放到了ebsynth_utility下。 …

Flowable边界事件-消息边界事件

消息边界事件 消息边界事件一、定义1. 图形标记2. 设置消息 选择消息3. XML标记 二、测试用例2.1 定时边界事件xml文件2.2 消息边界事件测试用例 总结 消息边界事件 一、定义 接收到消息触发事件 1. 图形标记 2. 设置消息 选择消息 3. XML标记 定时边界事件的XML <messag…

【sgWaterfall】Vue实现图文瀑布流布局模式,图片预加载显示占位区域阴影,加载完成后向上浮动动画出现

Vue实现图文瀑布流布局模式&#xff0c;图片预加载显示占位区域阴影&#xff0c;加载完成后向上浮动动画出现 sgWaterfall.vue源码 <template><ul :class"$options.name" :style"waterfallStyle"><li v-for"(a, i) in items "…

业务变革与架构双驱动的多项目管理︱海康威视流程变革咨询顾问张燕飞

海康威视数字技术股份有限公司流程与变革管理部流程变革咨询顾问张燕飞女士受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;业务变革与架构双驱动的多项目管理。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要…

如何在MySQL中安装示例数据库sakila

就像 SQLServer 示例数据库一样,MySQL 也有示例数据库,比如sakila;Sakila 数据库最初由 MySQL AB 文档团队的前成员 Mike Hillyer 开发,旨在提供一个标准模式,可用于书籍、教程、文章、示例等中的示例,它包含示例视图、存储过程和触发器。 以下是在服务器上安装sakila数…

33个字段,我乏了!

家人们&#xff0c;谁懂啊&#xff1f;&#xff1f;最近两天&#xff0c;一直在测试数据报告&#xff0c;一个页面有30多个字段的那种&#xff0c;从基础表写sql语句&#xff0c;执行&#xff0c;与页面显示的字段值进行对比&#xff0c;一个挨着一个&#xff0c;讲真&#xff…

热更新时:app经常因为HBuilder X的更新提示HTML5+ Runtime版本不匹配的问题

直接暴力解决问题。 "app-plus" : {"compatible": {"ignoreVersion": false,//可选&#xff0c;Boolean类型&#xff0c;是否忽略版本兼容检查提示}, }APP模块等相关配置改变还是需要整包APK更新。 只有热更新改前端代码&#xff0c;推荐直接配置…