深入理解Java虚拟机(JVM)中的垃圾回收器
垃圾回收(Garbage Collection, GC)是现代编程语言中用于管理内存的重要机制,特别是在Java虚拟机(JVM)中。
它的基本原理是自动检测和释放不再被程序使用的内存,以避免内存泄漏和提高程序执行效率。
1.GC的基本原理
-
内存管理模型:
- JVM的内存通常分为几个区域,包括堆(Heap)和栈(Stack)。其中,堆用于存储对象实例和数组,是GC主要工作的区域。
-
对象生命周期:
- 当程序创建对象时,它们被分配到堆上。对象在不再被引用时变得不可达。
- 垃圾回收器的主要任务是识别不再被引用的对象,并回收它们占用的内存。
-
GC的触发时机:
- JVM会定期或在特定条件下(如堆内存达到一定阈值)启动垃圾回收。
- 垃圾回收过程中,首先会暂停应用程序线程,然后进行不可达对象的标记和清理工作,最终释放未使用的内存。
2. 垃圾回收算法及其原理
Java中常见的垃圾回收算法包括标记-清除(Mark-Sweep)、复制(Copying)、标记-整理(Mark-Compact)以及分代垃圾回收算法。以下将详细介绍每种算法的原理和适用场景。
2.1 标记-清除算法(Mark-Sweep)
原理:
- 标记阶段:从根节点(如栈、静态变量)出发,标记所有能够被直接或间接引用的对象。
- 清除阶段:清除所有未被标记的对象,释放它们占用的内存空间。
优缺点:
- 优点:简单直接,实现相对容易。
- 缺点:会产生内存碎片,当无法找到足够大连续内存块时,可能导致频繁的内存分配失败。
示例代码:
// 假设有一个简单的类
class MyClass {// 一些字段和方法
}// 在代码中创建对象
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();// 让 obj1 不再被引用
obj1 = null;// 触发垃圾回收
System.gc();
2.2 复制算法(Copying)
原理:
- 将堆内存分为两个区域,每次只使用其中一个。
- 将存活的对象从一个区域复制到另一个区域,然后清理当前区域中所有不再被引用的对象。
优缺点:
- 优点:减少了内存碎片化问题,内存分配更加简单和高效。
- 缺点:浪费一半的内存空间。
示例代码:
// 假设有一个较大的数组
int[] largeArray = new int[1000000];// 数组不再被引用
largeArray = null;// 触发垃圾回收
System.gc();
2.3 标记-整理算法(Mark-Compact)
原理:
- 类似于标记-清除,但在清除阶段,会将存活的对象往堆内存的一端移动,然后清理掉端边界外的内存,从而减少内存碎片。
优缺点:
- 优点:减少了内存碎片,节省了内存空间。
- 缺点:移动对象需要额外的时间开销。
2.4 分代算法(Generational)
原理:
- 根据对象的生命周期将堆分为多个代,通常是新生代和老年代。
- 大部分对象具有短生命周期,因此将新创建的对象放入新生代,并使用较快速的垃圾回收算法(如复制算法)进行管理;老年代使用更稳定的垃圾回收算法(如标记-整理)进行管理。
优缺点:
- 优点:提高了垃圾回收的效率,减少了全堆垃圾回收的频率。
- 缺点:需要额外的逻辑来管理不同代之间的对象移动和回收。
3. 垃圾回收器
Java的不同垃圾回收器针对不同的应用需求和性能优化选择了不同的回收算法和实现特性:
-
Serial GC:
- 算法:复制算法。
- 特点:单线程执行,适用于小型或单核心机器。
-
Parallel GC:
- 算法:复制算法和标记-整理算法。
- 特点:多线程执行,适合多核心机器和高吞吐量应用。
-
CMS GC(Concurrent Mark-Sweep):
- 算法:标记-清除算法和并发标记算法。
- 特点:通过并发标记阶段减少停顿时间,适用于响应时间敏感的应用。
-
G1 GC(Garbage-First):
- 算法:分代算法,结合复制算法和标记-整理算法。
- 特点:通过优先处理回收价值最大的区域提高整体性能和稳定性。
-
ZGC 和 Shenandoah GC:
- 算法:基于并发算法,专注于减少长时间停顿,适用于大内存和高吞吐量的应用。
4. JVM的配置
JVM的配置通过启动参数来设置,以满足应用程序的性能和需求。以下是常见的JVM配置参数:
-
选择垃圾回收器:
-XX:+UseSerialGC
:使用Serial GC。-XX:+UseParallelGC
:使用Parallel GC。-XX:+UseConcMarkSweepGC
:使用CMS GC。-XX:+UseG1GC
:使用G1 GC。-XX:+UseZGC
:使用ZGC。-XX:+UseShenandoahGC
:使用Shenandoah GC。
-
调整堆大小:
-Xms<size>
:设置初始堆大小。-Xmx<size>
:设置最大堆大小。
-
调整垃圾回收器相关参数:
-XX:NewSize=<size>
:设置新生代大小。-XX:MaxNewSize=<size>
:设置新生代最大大小。-XX:SurvivorRatio=<ratio>
:设置Eden区和Survivor区的比例。
-
监控和调试:
-XX:+PrintGCDetails
:打印详细的GC日志信息。-XX:+HeapDumpOnOutOfMemoryError
:在内存溢出时生成堆转储文件。
通过合理配置这些参数,可以优化JVM的性能和内存管理,提升Java应用程序的稳定性和效率。选择适当的垃圾回收器和调整参数,是实现高性能Java应用的重要步骤。
结论
垃圾回收是Java语言的核心特性之一,有效的垃圾回收机制能够提升程序的性能和稳定性。理解垃圾回收的基本原理、不同的回收算法及其适用场景,以及如何通过JVM的配置来优化内存管理,对于Java开发人员至关重要。
相关文章:
深入理解Java虚拟机(JVM)中的垃圾回收器
垃圾回收(Garbage Collection, GC)是现代编程语言中用于管理内存的重要机制,特别是在Java虚拟机(JVM)中。 它的基本原理是自动检测和释放不再被程序使用的内存,以避免内存泄漏和提高程序执行效率。 1.GC的基…...
视频集市新增支持多格式流媒体拉流预览
流媒体除了常用实时流外还有大部分是以文件的形式存在,做融合预览必须要考虑多种兼容性能力,借用现有的ffmpeg生态可以迅速实现多种格式的支持,现在我们将按需拉流预览功能进行了拓展,正式支持了ffmpeg的功能,可快捷方…...
定时器-前端使用定时器3s轮询状态接口,2min为接口超时
背景 众所周知,后端是处理不了复杂的任务的,所以经过人家的技术讨论之后,把业务放在前端来实现。记录一下这次的离大谱需求吧。 如图所示,这个页面有5个列表,默认加载计划列表。但是由于后端的种种原因,这…...
python实践笔记(二): 类和对象
1. 写在前面 最近在重构之前的后端代码,借着这个机会又重新补充了关于python的一些知识, 学习到了一些高效编写代码的方法和心得,比如构建大项目来讲,要明确捕捉异常机制的重要性, 学会使用try...except..finally&…...
指定GPU跑模型
加上一个CUDA_VISIBLE_DEVICES0,2就行了,使用0卡和2卡跑模型,注意多卡有时候比单卡慢,4090无NVlink,数据似乎是通过串行的方式传输到多个gpu的,只不过单个gpu是并行计算,数据在gpu与gpu之间似乎是串行传输的…...
Windows桌面运维----第五天
1、华为路由怎们配置IP、划分vlan、互通: 1、用户模式→系统模式; 2、进入相关端口,配置IP地址; 3、开通相应vlan,设置vlanX、IP地址; 4、绑定相关端口,设置端口类型; 5、电脑设置IP&#…...
bash和dash的区别(及示例)
什么是bash、dash Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等。 GNU/Linux 操作系统中的 /bin/sh 本是 bash (Bourne-Again Shell) 的符号链接࿰…...
Java基础入门day65
day65 web项目 页面设计 仿照小米官网,将首页保存到本地为一个html页面,再将html页面保存为jsp页面,在项目中的web.xml文件中配置了欢迎页 <welcome-file-list><welcome-file>TypesServlet</welcome-file> </welcome-…...
解密制度的规定和解密工作的具体流程
解密制度是指对于某些敏感的文件或资料,经过一定的时间后,根据相关规定和程序,可以进行解密,解除文件的保密状态,使其可以被公众查阅或利用。解密制度的目的在于确保涉密信息的保密等级与其重要程度相适应,防止涉密信息的泄露和使用不当,同时促进信息公开、传播历史知识…...
实际中常用的网络相关命令
一、ping命令 ping是个使用频率极高的实用程序,主要用于确定网络的连通性。这对确定网络是否正确连接,以及网络连接的状况十分有用。 简单的说,ping就是一个测试程序,如果ping运行正确,大体上就可以排除网络访问层、网…...
机器学习补充
一、数据抽样 数据预处理阶段:对数据集进行抽样可以帮助减少数据量,加快模型训练的速度/减少计算资源的消耗,特别是当数据集非常庞大时,比如设置sample_rate0.8.平衡数据集:通过抽样平衡正负样本,提升模型…...
机器学习——RNN、LSTM
RNN 特点:输入层是层层相关联的,输入包括上一个隐藏层的输出h1和外界输入x2,然后融合一个张量,通过全连接得到h2,重复 优点:结构简单,参数总量少,在短序列任务上性能好 缺点&#x…...
Java项目学习(员工管理)
新增、员工列表、编辑员工整体代码流程与登录基本一致。 1、新增员工 RestController RequestMapping("/admin/employee")EmployeeController 类中使用了注解 RestController 用于构建 RESTful 风格的 API,其中每个方法的返回值会直接序列化为 JSON 或…...
视觉SLAM14精讲——相机与图像3.3
视觉SLAM14精讲 三维空间刚体运动1.0三维空间刚体运动1.1三维空间刚体运动1.2李群与李代数2.1相机与图像3.1相机与图像3.2 视觉SLAM14精讲——相机与图像3.3 视觉SLAM14精讲相机投影流程双目相机模型 相机投影流程 至此,有关相机三维刚体变换的所有因素已经汇集。…...
【路径规划】基于粒子群结合遗传算法实现机器人栅格地图路径规划
研究方法: 基于粒子群优化算法结合遗传算法的机器人栅格地图路径规划是一种智能算法的应用。它将粒子群优化算法和遗传算法相结合,以寻找最优路径规划解决方案。 研究路线: 理论研究:了解粒子群优化算法和遗传算法的基本原理,并掌握相关的路径规划理论知识。 算法设计:…...
内容安全复习 9 - 身份认证系统攻击与防御
文章目录 基于生物特征的身份认证系统概述基于生物特征的身份认证 人脸活体检测检测方法未解决问题 基于生物特征的身份认证系统概述 作用:判别用户的身份、保障信息系统安全。 是识别操作者身份的过程,要保证其**物理身份(现实࿰…...
Python-gui开发之Pycharm+pyside6/Pyqt6环境搭建
Python-gui开发之Pycharm+pyside6/Pyqt6环境搭建 软件版本一、软件安装1、Python安装2、Pycharm安装3、pyside6或pyqt6安装①安装pyside6②安装PyQt6和pyqt6-tools二、Pycharm项目配置1、插件安装2、新建项目以及环境配置3、包管理安装三、在Pycharm中配置PySide61、pyside6 Qt…...
大数据开发语言Scala入门 ,如何入门?
Ai文章推荐 1 作为程序员,开发用过最好用的AI工具有哪些? 2 Github Copilot正版的激活成功,终于可以chat了 3 idea,pycharm等的ai assistant已成功激活 4 新手如何拿捏 Github Copilot AI助手,帮助你提高写代码效率 5 Jetbrains的…...
【人机交互 复习】第1章 人机交互概述
人机交互的知识点碎,而且都是文字,过一遍脑子里什么都留不下,但是背时间已经来不及了,最好还是找题要题感吧,加深印象才是做对文科的关键 一、概念 1.人机交互(Human-Computer Interaction,HCI)࿱…...
HCIP-HarmonyOS Device Developer 课程大纲
一:系统及应用场景介绍 1 -(3 课时) - HarmonyOS 系统介绍;HarmonyOs 定义;HarmonyOS 特征; - 统一 OS,弹性部署;硬件互助,资源共享;一次开发,多…...
蓝桥杯 经典算法题 查找两个总和为特定值的索引
题目: 给定一个数组,找到两个总和为特定值的索引。 例如给定数组 [1, 2, 3, -2, 5, 7],给定总和 7,则返回索引 [1, 4]。 若有多组符合情况则输出索引对中小索引最小的一组。 题解: 本题可以通过暴力枚举,枚举每两…...
Java | Leetcode Java题解之第169题多数元素
题目: 题解: class Solution {public int majorityElement(int[] nums) {int count 0;Integer candidate null;for (int num : nums) {if (count 0) {candidate num;}count (num candidate) ? 1 : -1;}return candidate;} }...
十大机器学习算法深入浅出
本栏目涉及对于回归算法、聚类算法、决策树、随机森林、神经网络、贝叶斯算法、支持向量机等十大机器学习算法的笔记 下面是笔记大纲,具体内容可查看**“十大机器学习算法深入浅出”**专栏,内容持续更新,欢迎订阅专栏和专注我! 1…...
【论文笔记】Parameter-Effificient Transfer Learning for NLP
题目:Parameter-Effificient Transfer Learning for NLP 阅读 文章目录 0.摘要1.引言2 Adapter tuning for NLP3 实验3.1 参数/性能平衡3.2 讨论 4.相关工作 0.摘要 克服微调训练不高效的问题,增加一些adapter模块,思想就是固定原始的网络中的参数&…...
Qt异常处理
初步警告:异常安全功能不完整!一般情况下应该可以工作,但类仍然可能泄漏甚至崩溃。 Qt本身不会抛出异常。而是使用错误码, 但是C可能会抛出异常。此外,有些类有用户可见的错误消息,例如QIODevice::errorString()或QSqlQuery::lastError()。这…...
【ElasticSearch】ElasticSearch实战
初步检索 检索 ES 信息 1)、GET /_cat/nodes:查看所有节点 127.0.0.1 44 83 1 0.01 0.01 0.00 dilm * 1b06a843b8e3 *代表主节点 2)、GET /_cat/health:查看健康状况 1718265331 07:55:31 elasticsearch yellow 1 1 4 4 0 0…...
48-3 内网渗透 - 令牌操纵
访问令牌操纵 Windows 操作系统的访问控制模型是其安全性的重要组成部分,主要由访问令牌(Access Token)和安全描述符(Security Descriptor)构成。访问令牌是访问者持有的,而安全描述符则由被访问对象持有。通过对比访问令牌和安全描述符的内容,Windows 可以判断访问者是…...
架构师之 Kafka 核心概念入门
Kafka 核心概念 作为架构师,理解 Kafka 的核心概念至关重要。这些概念是构建高效、可靠的 Kafka 系统的基础。 以下是需要掌握的 Kafka 核心概念及其详细说明: 1. Topic 定义:Topic 是 Kafka 中用于存储和分类消息的逻辑命名空间。每个 Topic 代表一类数据流, 例如日志、…...
Redis通用命令详解
文章目录 一、Redis概述1.1 KEYS:查看符合模板的所有 key1.2 DEL:删除一个指定的 key1.3 EXISTS:判断 key 是否存在1.4 EXPIRE:给一个 key 设置有效期,有效期到期时该 key 会被自动删除1.5 TTL:查看一个 ke…...
物联网设备安装相关知识整理
拓扑图 对于ADAM-4150先接设备的整体的供电。 ADAM-4150就涉及到几个电子元器件的连接,一个是485-232的转换器,一个是将RS-232转换为USB的转接口,因为现在的计算机很多都去掉了RS-232接口而使用USB接口。 4150右侧有个拨码,分别两…...
国内简洁大气网站推荐/网络营销策划的目的
一、在程序如何定义个变量?定义变量在内存中代表什么意思? 1、 变量的定义? 格式:数据类型 变量 数据类型 -> 决定在内存中占用字节的大小。 变量名字 -> 决定如何访问到这片内存的空间。 2、初始化变量的值࿱…...
做网站的windowlcd/b站官方推广
转自:http://hi.baidu.com/jingweiyoung/item/55a895cc22b8abdeee183bb0 linux下为了多线程同步,通常用到锁的概念。 posix下抽象了一个锁类型的结构:ptread_mutex_t。通过对该结构的操作,来判断资源是否可以访问。顾名思义&#…...
咸宁网站制作公司/漳州seo建站
OpenCV3.4.1OpenCV_contribVS2013配置(精准无错)Opencv3.4.1和Opencv_contrib的下载(要对应的版本)CMake软件的下载(无需安装),编译opencv配置叽叽叽,来填坑辣Opencv3.4.1和Opencv_c…...
外贸获客软件排名前十名/甘肃省seo关键词优化
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1]。 示例 1: 输入: nums [5,7,7,8,8,10], target 8 输…...
子网站怎么建设/新媒体运营主要做什么
有点意思的main 图解运行结果解释:[:数组L:长类型ava.lang:包名String:字符串类型元素:分界符667262b6:哈希值主函数特殊之处:public static void main(String[] args) 1,格式固定2&…...
wordpress+qq音乐插件/小红书推广方式
文章目录1、man命令(1)man命令的快捷键(2)man命令的帮助级别(了解即可)2、info命令3、help命令4、--help选项1、man命令 man是最常见的帮助命令,也是Linux最主要的帮助命令,其基本信…...