了解Java垃圾收集
Java 的垃圾收集机制在 Java 应用程序开发中至关重要。此机制对于通过消除不再使用的对象来释放内存空间得过程来说至关重要。在这篇文章中,我带大家深入了解下 Java 垃圾收集的机制,并探索其工作原理、优点以及实现最佳性能的最佳实践。
1.什么是 Java 垃圾回收?
Java 的垃圾收集是 Java 虚拟机 (JVM) 中的自动内存管理机制。它识别并丢弃程序不再使用的对象,释放内存并防止内存泄漏。这是一个关键功能,它允许 Java 程序避免手动分配和取消分配内存。
2. Java 垃圾收集是如何工作的?
Java 的垃圾收集机制会自动进行,无需程序员显式干预。JVM 实现垃圾收集时,该过程涉及识别程序不再引用的对象,将它们标记为删除,然后删除它们。它还可以通过移动剩余对象来压缩堆,从而使新对象的空间分配更有效。
3. 垃圾收集过程中有哪些步骤?
垃圾收集过程通常涉及三个步骤,
-
识别未引用的对象并将其标记为准备进行垃圾收集。
-
删除这些标记的对象以回收内存空间。
-
通过将剩余对象重新排列到连续块中来压缩堆,从而优化新对象的内存分配。
4. 分代垃圾收集策略如何运作?
在分代垃圾收集中,对象根据年龄进行分类,因为不同年龄组的存活率往往不同。较年轻的对象更有可能很快变得无法访问并被分配给较年轻的一代。在年轻代中经历过多次垃圾收集周期的对象会被移至老一代,在那里垃圾收集发生的频率较低。此策略通过关注垃圾收集最有可能找到未引用对象的堆区域来提高效率。
5. 垃圾收集器对对象有哪些不同的分类?
Java 中的堆通常分为三个部分以进行垃圾回收:
-
年轻代:针对新创建的对象。它分为一个伊甸园空间和两个幸存者空间。
-
老一代:适用于堆中存在时间较长的对象。
-
永久生成(或较新版本的 Java 中的元空间):它存储元数据,例如类和方法对象。
6. HotSpot JVM 中的垃圾收集器有哪些不同类型?
HotSpot JVM 提供四种主要类型的垃圾收集器:
-
Serial Garbage Collector:使用单线程进行垃圾收集,适合单线程应用。
-
并行垃圾收集器:在年轻代中利用多个线程进行垃圾收集,在老一代中通常使用单线程,非常适合多线程应用程序。
-
CMS(并发标记扫描):使用多个线程,旨在通过与应用程序同时执行大部分工作来最大限度地减少应用程序暂停时间。
-
G1(垃圾优先):一种更现代、并行和并发的收集器,适用于具有大型堆的应用程序,专注于可预测的暂停时间。
7. 什么时候触发垃圾收集?
有几个事件可以触发垃圾收集:
-
分配失败:当堆中没有足够的空间来分配新对象时。
-
堆大小阈值:当堆使用量达到特定阈值时。
-
System.GC() 方法调用,尽管它不保证能触发垃圾收集。
-
基于时间的触发器:某些算法(例如 G1)使用基于时间的条件来启动垃圾收集。
8. 常见垃圾收集器的选择和调优
GC 算法
在实际应用中,选择合适的垃圾收集器及其调优是提升应用性能的关键。以下是一些指导原则,大家根据应用需求选择 GC 算法,
-
单线程、低需求应用:选择 Serial GC。
-
多线程、追求吞吐量:选择 Parallel GC。
-
低停顿时间、响应快速:选择 CMS GC 或 G1 GC。
-
超低停顿时间、大堆:选择 ZGC。
JVM 参数
堆内存设置
-
-Xms:设置 JVM 启动时堆内存的初始大小。例如,-Xms512m 表示设置 JVM 启动时的初始堆内存大小为 512MB。
-
-Xmx:设置 JVM 可以使用的最大堆内存大小。例如,-Xmx1024m 表示设置 JVM 最大堆内存为 1024MB。
-
-XX:MinHeapFreeRatio:设置堆空闲时最小空间比率。
-
-XX:MaxHeapFreeRatio:设置堆空闲时最大空间比率。 新生代和老年代内存设置
-
-Xmn:设置新生代的大小。新生代的大小直接影响到 Minor GC 的性能。
-
-XX:NewRatio:设置老年代和新生代的比例。默认是 2,表示老年代占用的堆的 2/3,新生代占 1/3。
-
-XX:SurvivorRatio:设置新生代中 Eden 区与两个 Survivor 区的比例。
-
-XX:MaxTenuringThreshold:设置对象晋升到老年代的年龄阈值。 垃圾收集器设置
-
-XX:+UseSerialGC:设置使用串行收集器。
-
-XX:+UseParallelGC:设置使用并行垃圾收集器。
-
-XX:+UseConcMarkSweepGC:设置使用 CMS 垃圾收集器。
-
-XX:+UseG1GC:启用 G1 垃圾收集器。
-
-XX:ParallelGCThreads:设置并行收集器的线程数量。
-
-XX:+UseStringDeduplication:开启 JDK 8u20 引入的字符串去重功能,适用于 G1 收集器。 监控和调试
-
-XX:+PrintGCDetails:打印收集器回收日志。
-
-XX:+PrintGCDateStamps:输出 GC 的时间戳(以日期的形式)。
-
-XX:+PrintHeapAtGC:在 GC 前后打印出堆的信息。
-
-XX:+HeapDumpOnOutOfMemoryError:在内存溢出时自动生成堆转储快照。
-
-XX:HeapDumpPath:指定堆转储快照的输出路径。
-
-XX:+PrintFlagsFinal:打印所有参数的最终值。 性能优化
-
-XX:+UseAdaptiveSizePolicy:自适应调整策略,允许并行收集器调整新生代、Eden 区和 Survivor 区的大小以及晋升老年代的对象年龄,以提高性能。
-
-XX:+DisableExplicitGC:禁止通过 System.gc()或者 Runtime.getRuntime().gc()方法显式调用 GC。
总结
Java 的垃圾收集机制是其内存管理的重要组成部分。通过理解垃圾收集的原理和不同垃圾收集器的特点,开发者可以更好地优化应用程序性能,避免常见的内存管理错误。合理选择和调优垃圾收集器,不仅能提升应用的响应速度和稳定性,还能在一定程度上简化开发过程中内存管理的复杂性。
关注公众号【waynblog】每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力!
相关文章:

了解Java垃圾收集
Java 的垃圾收集机制在 Java 应用程序开发中至关重要。此机制对于通过消除不再使用的对象来释放内存空间得过程来说至关重要。在这篇文章中,我带大家深入了解下 Java 垃圾收集的机制,并探索其工作原理、优点以及实现最佳性能的最佳实践。 1.什么是 Java…...

快速搭建 WordPress 外贸电商网站指南
本指南全面解析了在 Hostinger 平台上部署 WordPress 外贸电商网站的详细步骤,涵盖托管方案选择、WordPress 一键安装、主题挑选与演示数据导入、主题个性化定制、SEO插件插件 AIOSEO 安装、通过 GTranslate 实现多语言自动翻译、地区访问控制插件,助力用…...
网络编程 —— Http进度条
第一种下载带进度的方法 string url "https://nodejs.org/dist/v20.10.0/node-v20.10.0-x64.msi"; 1使用getASync获取服务器响应数据 参数1请求的路径, 参数2 HttpCompletionOption.ResponseHeadersRead 请求完成时候等待请求带什么程度才…...

5月26(信息差)
🌍 珠峰登顶“堵车”后冰架断裂 5人坠崖 2人没爬上来! 珠峰登顶“堵车”后冰架断裂 5人坠崖 2人没爬上来! 🎄 Windows 11 Beta 22635.3646 预览版发布:中国大陆地区新增“微软电脑管家”应用 ✨ 成都限购解除即将满…...

【Redis】持久化操作详解
Redis 持久化操作详解 Redis 实现持久化的时候,具体是按照什么样的策略来实现的呢? Redis支持两种方式的持久化,一种是RDB方式、另一种是AOF(append-only-file)方式,两种持久化方式可以单独使用其中一种&…...

C#调用HttpClient.SendAsync报错:System.Net.Http.HttpRequestException: 发送请求时出错。
C#调用HttpClient.SendAsync报错:System.Net.Http.HttpRequestException: 发送请求时出错。 var response await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);问题出在SSL/TLS,Windows Server 2012不支持…...

大模型基础知识
文章目录 1. 位置编码1.1 绝对位置编码1.2 相对位置编码1.3 旋转位置编码2. 注意力机制2.1 MHA(muti head attention)2.2 MQA(muti query attention)2.3 GQA(grouped query attention)3. 大模型分类4. 微调方法4.1 Prompt Tuning4.2 Prefix Tuning4.3 Lora4.4 QLora5. La…...

时间序列预测模型实战案例(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)
目录 引言 LSTM的预测效果图 LSTM机制 了解LSTM的结构 忘记门 输入门 输出门 LSTM的变体 只有忘记门的LSTM单元 独立循环(IndRNN)单元 双向RNN结构(LSTM) 运行代码 代码讲解 引言 LSTM(Long Short-Term Memory)是一种常用的循环神经网络&a…...

[8] CUDA之向量点乘和矩阵乘法
CUDA之向量点乘和矩阵乘法 计算类似矩阵乘法的数学运算 1. 向量点乘 两个向量点乘运算定义如下: #真正的向量可能很长,两个向量里边可能有多个元素 (X1,Y1,Z1) * (Y1,Y2,Y3) X1Y1 X2Y2 X3Y3这种原始输入是两个数组而输出却缩减为一个(单一值)的运…...

音视频开发9 FFmpeg 解复用框架说明,重要知识点
一,播放器框架 二 常用音视频术语 容器/文件(Conainer/File): 即特定格式的多媒体文件, 比如mp4、flv、mkv等。 媒体流(Stream): 表示时间轴上的一段连续数据࿰…...

抖音小店出单之后怎么发货?抖店详细发货流程来了
大家好,我是喷火龙。 抖音小店发货是有规则的,如果出现超时发货或者虚假发货都会被平台处罚的,会影响我们店铺的评分和正常运营,还有些小伙伴们在发货的时候会遇到平台的违规提醒等问题。 今天我就给大家讲一下抖音小店的发货流…...
Transformer详解(5)-编码器和解码器
1、Transformer编码器 import torch from torch import nn import copy from norm import Norm from multi_head_attention import MultiHeadAttention from feed_forward import FeedForward from pos_encoder import PositionalEncoderdef get_clones(module, N):"&quo…...
线程安全-3 JMM
一.谈一下JMM 1.JMM,JavaMemoryModel,Java内存模型。定义了多线程对共享内存读写操作的行为规范,通过规范多线程对共享内存的读写操作,以保证指令执行和结果的正确性。 2.JMM把内存分为两块 (1)主内存&a…...
4 CSS的 变换、过渡与动画
CSS3引入了变换、过渡和动画特性,使得网页可以呈现出丰富的视觉效果和交互体验。通过这些新特性,开发者可以创建复杂的动画效果,而不需要使用JavaScript。 4.1 变换(Transforms) 变换允许开发者对元素进行旋转、缩放…...
前端基础入门三大核心之JS篇:掌握数字魔法 ——「累加器与累乘器」的奥秘籍【含样例代码】
前端基础入门三大核心之JS篇:掌握数字魔法 ——「累加器与累乘器」的奥秘籍 🧙♂️ 基础概念:数字的魔杖与炼金术累加器(Accumulator)累乘器(Multiplier) 📚 实战演练:…...
git clone 出现的问题
问题: core源码ref新API % git clone https://github.com/xxxx.git Cloning into core... remote: Enumerating objects: 58033, done. remote: Counting objects: 100% (1393/1393), done. remote: Compressing objects: 100% (750/750), done. error: 432 bytes of body are …...

Vue2和Vue3生命周期的对比
Vue2和Vue3生命周期的对比 Vue2 和 Vue3 生命周期对照表Vue2 和 Vue3 生命周期图示 Vue2 和 Vue3 生命周期对照表 触发时机Vue2.xVue3.x组件创建时运行beforeCreate setup createdsetup 挂载在DOM时运行beforeMountonBeforeMountmountedonMounted响应数据修改时运行beforeUpdat…...

全面解析Java.lang.ClassCastException异常
全面解析Java.lang.ClassCastException异常 全面解析Java.lang.ClassCastException异常:解决方案与最佳实践 🚀📚摘要引言1. 什么是Java.lang.ClassCastException?代码示例 2. 报错原因2.1 类型不兼容2.2 泛型类型擦除2.3 接口和实…...

美团Java社招面试题真题,最新面试题
如何处理Java中的内存泄露? 1、识别泄露: 使用内存分析工具(如Eclipse Memory Analyzer Tool、VisualVM)来识别内存泄露的源头。 2、代码审查: 定期进行代码审查,关注静态集合类属性和监听器注册等常见内…...

二十八、openlayers官网示例Data Tiles解析——自定义绘制DataTile源数据
官网demo地址: https://openlayers.org/en/latest/examples/data-tiles.html 这篇示例讲解的是自定义加载DataTile源格式的数据。 先来看一下什么是DataTile,这个源是一个数组,与我们之前XYZ切片源有所不同。DataTile主要适用于需要动态生成…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...