当前位置: 首页 > news >正文

了解Java垃圾收集

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

1.什么是 Java 垃圾回收?

Java 的垃圾收集是 Java 虚拟机 (JVM) 中的自动内存管理机制。它识别并丢弃程序不再使用的对象,释放内存并防止内存泄漏。这是一个关键功能,它允许 Java 程序避免手动分配和取消分配内存。

2. Java 垃圾收集是如何工作的?

Java 的垃圾收集机制会自动进行,无需程序员显式干预。JVM 实现垃圾收集时,该过程涉及识别程序不再引用的对象,将它们标记为删除,然后删除它们。它还可以通过移动剩余对象来压缩堆,从而使新对象的空间分配更有效。

3. 垃圾收集过程中有哪些步骤?

垃圾收集过程通常涉及三个步骤,

  1. 识别未引用的对象并将其标记为准备进行垃圾收集。

  2. 删除这些标记的对象以回收内存空间。

  3. 通过将剩余对象重新排列到连续块中来压缩堆,从而优化新对象的内存分配。

4. 分代垃圾收集策略如何运作?

在分代垃圾收集中,对象根据年龄进行分类,因为不同年龄组的存活率往往不同。较年轻的对象更有可能很快变得无法访问并被分配给较年轻的一代。在年轻代中经历过多次垃圾收集周期的对象会被移至老一代,在那里垃圾收集发生的频率较低。此策略通过关注垃圾收集最有可能找到未引用对象的堆区域来提高效率。

5. 垃圾收集器对对象有哪些不同的分类?

Java 中的堆通常分为三个部分以进行垃圾回收:

  1. 年轻代:针对新创建的对象。它分为一个伊甸园空间和两个幸存者空间。

  2. 老一代:适用于堆中存在时间较长的对象。

  3. 永久生成(或较新版本的 Java 中的元空间):它存储元数据,例如类和方法对象。

6. HotSpot JVM 中的垃圾收集器有哪些不同类型?

HotSpot JVM 提供四种主要类型的垃圾收集器:

  1. Serial Garbage Collector:使用单线程进行垃圾收集,适合单线程应用。

  2. 并行垃圾收集器:在年轻代中利用多个线程进行垃圾收集,在老一代中通常使用单线程,非常适合多线程应用程序。

  3. CMS(并发标记扫描):使用多个线程,旨在通过与应用程序同时执行大部分工作来最大限度地减少应用程序暂停时间。

  4. G1(垃圾优先):一种更现代、并行和并发的收集器,适用于具有大型堆的应用程序,专注于可预测的暂停时间。

7. 什么时候触发垃圾收集?

有几个事件可以触发垃圾收集:

  1. 分配失败:当堆中没有足够的空间来分配新对象时。

  2. 堆大小阈值:当堆使用量达到特定阈值时。

  3. System.GC() 方法调用,尽管它不保证能触发垃圾收集。

  4. 基于时间的触发器:某些算法(例如 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): 表示时间轴上的一段连续数据&#xff0…...

抖音小店出单之后怎么发货?抖店详细发货流程来了

大家好,我是喷火龙。 抖音小店发货是有规则的,如果出现超时发货或者虚假发货都会被平台处罚的,会影响我们店铺的评分和正常运营,还有些小伙伴们在发货的时候会遇到平台的违规提醒等问题。 今天我就给大家讲一下抖音小店的发货流…...

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主要适用于需要动态生成…...

大话软工笔记—需求分析概述

需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...