MQ,RabbitMQ,MQ的好處,RabbitMQ的原理和核心組件,工作模式

1.MQ

?MQ全稱 Message Queue(消息隊列),是在消息的傳輸過程中? 保存消息的容器。它是應用程序和應用程序之間的通信方法

1.1?為什么使用MQ

在項目中,可將一些無需即時返回且耗時的操作提取出來,進行異步處理,而這種異步處理的方式大大的節省了服務器的請求響應時間,從而提高系統吞吐量

1.2MQ的好處

1.應用解耦? ?系統間通過消息通信,不用關心其他系統的處理。

2.異步提速??相比于傳統的串行、并行方式,提高了系統吞吐量。

3.削峰填谷? ?可以通過消息隊列長度控制請求量;可以緩解短時間內的高并發請求。

簡單來說: 就是在訪問量劇增的情況下,但是應用仍然不能停,比如“雙十一”下單的人多,但是淘寶這個應用仍然要運行,所以就可以使用消息中間件采用隊列的形式減少突然訪問的壓力

使用MQ后,可以提高系統穩定性

1.3劣勢

  1. 系統可用性降低 系統引入的外部依賴越多,系統穩定性越差。一旦 MQ 宕機,就會對業務造成影響。如何保證MQ的高可用?

  2. 系統復雜度提高 MQ 的加入大大增加了系統的復雜度,以前系統間是同步的遠程調用,現在是通過 MQ 進行異步調用。如何保證消息沒有被重復消費?怎么處理消息丟失情況?那么保證消息傳遞的順序性?

  3. 一致性問題 A 系統處理完業務,通過 MQ 給B、C、D三個系統發消息數據,如果 B 系統、C 系統處理成功,D 系統處理失敗。如何保證消息數據處理的一致性?

1.4常見的MQ組件

RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等

2.RabbitMQ

RabbitMQ是一個由erlang開發的AMQP(Advanced Message Queue 高級消息隊列協議 )的開源實現,由于erlang 語言的高并發特性,性能較好,本質是個隊列,FIFO 先入先出,里面存放的內容是message

RabbitMQ是一個消息中間件:它接受并轉發消息。你可以把它當做一個快遞站點,當你要發送一個包裹時,你把你的包裹放到快遞站,快遞員最終會把你的快遞送到收件人那里,按照這種邏輯RabbitMQ是一個快遞站,一個快遞員幫你傳遞快件。RabbitMQ與快遞站的主要區別在于,它不處理快件而是接收,存儲和轉發消息數據。

2.1RabbitMQ的原理

核心組件

  1. 生產者(Producer):負責發送消息到交換器的客戶端應用程序。

  2. 消費者(Consumer):從隊列中獲取并處理消息的客戶端應用程序。

  3. 交換器(Exchange):接收生產者發送的消息,并根據路由規則將消息轉發到相應的隊列。

  4. 隊列(Queue):存儲消息,直到消費者取走消息。

  5. 綁定(Binding):定義交換器和隊列之間的關聯關系。

工作流程

  1. 消息發送:生產者通過信道(Channel)將消息發送到交換器。

  2. 消息路由:交換器根據路由鍵(Routing Key)和綁定鍵(Binding Key)將消息路由到相應的隊列。

  3. 消息存儲:隊列存儲消息,等待消費者取走。

  4. 消息消費:消費者通過信道從隊列中獲取消息并處理。

交換器類型

  1. Direct:根據完全匹配的路由鍵將消息發送到相應的隊列。

  2. Fanout:將消息廣播到所有綁定的隊列,不考慮路由鍵。

  3. Topic:根據模式匹配的路由鍵將消息發送到相應的隊列。

2.2簡單模式simple

生產者向隊列投遞消息,消費者從其中取出消息

1.依賴

<!--        java連接rabbitmq的依賴--><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.16.0</version></dependency>

2.生產消息

package com.ghx.hello;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;
import java.util.concurrent.TimeoutException;/*** @author :guo* @date :Created in 2025/3/20 11:35* @description:* @version:*/
public class Test01 {public static void main(String[] args) throws IOException, TimeoutException {//創建連接工廠ConnectionFactory factory=new ConnectionFactory();//rabbitmq服務器地址 默認本地localhostfactory.setHost("xxxx");//端口號 默認5672factory.setPort(5672);//用戶名 密碼  默認guestfactory.setUsername("guest");factory.setPassword("guest");factory.setVirtualHost("/");//創建連接對象Connection connection=factory.newConnection();//獲取channel對象Channel channel = connection.createChannel();//創建隊列 存在則不創建,不存在則創建//String queue, 隊列名// boolean durable, 是否持久化// boolean exclusive, 是否獨占隊列 false// boolean autoDelete,是否自動刪除 false// Map<String, Object> arguments 隊列的參數配置--消息的格式 消息存放的時間等channel.queueDeclare("hello",true,false,false,null);String msg="hello rabbitmq2";//String exchange,交換機的名稱 "":默認交換機// String routingKey, 路由key "hello":隊列名// BasicProperties props, 消息的屬性--設置過期時間 設置id等 null// byte[] body  消息的內容channel.basicPublish("","hello",null,msg.getBytes());System.out.println("消息發送成功");channel.close();connection.close();}
}

3.消費消息

package com.ghx.hello;import com.rabbitmq.client.*;import java.io.IOException;
import java.util.concurrent.TimeoutException;/*** @author :guo* @date :Created in 2025/3/20 14:22* @description:* @version:*/
public class Test01 {public static void main(String[] args) throws IOException, TimeoutException {//創建連接工廠ConnectionFactory factory=new ConnectionFactory();//rabbitmq服務器地址 默認本地localhostfactory.setHost("xxxx");//端口號 默認5672factory.setPort(5672);//用戶名 密碼  默認guestfactory.setUsername("guest");factory.setPassword("guest");//虛擬機名稱 默認/factory.setVirtualHost("/");//創建連接對象Connection connection = factory.newConnection();//獲取channel對象Channel channel = connection.createChannel();DefaultConsumer consumer=new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("消費者1收到消息"+new String(body));}};//接受消息channel.basicConsume("hello",true,consumer);//不要關閉連接和channel  監聽消息}
}

2.3工作者模式work queues

多個消費者消費同一個隊列中的消息,多個消費者之間屬于競爭關系,一個消息只能被一個消費者消費,適合對于任務過重或任務較多的情況,使用工作隊列可以提高任務的處理速度

1.生產者

package com.ghx.work;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;/*** @author :guo* @date :Created in 2025/3/20 14:51* @description:* @version:*/
public class Test03 {private static final String QUEUE_NAME="queue01";public static void main(String[] args) {ConnectionFactory factory=new ConnectionFactory();factory.setHost("xxxx");factory.setPort(5672);factory.setUsername("guest");factory.setPassword("guest");factory.setVirtualHost("/");try {Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.queueDeclare(QUEUE_NAME,true,false,false,null);for (int i = 0; i < 10; i++){String msg="你好  世界"+i;channel.basicPublish("",QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN,msg.getBytes("utf-8"));}channel.close();connection.close();}catch (Exception e){}}
}

2.? 2個消費者

package com.ghx.work;import com.rabbitmq.client.*;import java.io.IOException;
import java.util.concurrent.TimeoutException;/*** @author :guo* @date :Created in 2025/3/20 15:00* @description:* @version:*/
public class Test03 {private static final String QUEUE_NAME="queue01";public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory factory=new ConnectionFactory();factory.setHost("xxxX");factory.setPort(5672);factory.setUsername("guest");factory.setPassword("guest");factory.setVirtualHost("/");Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.queueDeclare(QUEUE_NAME,true,false,false,null);channel.basicQos(1);Consumer consumer = new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("消費者1收到消息"+new String(body));}};//接收消息channel.basicConsume(QUEUE_NAME,true,consumer);}}
package com.ghx.work;import com.rabbitmq.client.*;import java.io.IOException;
import java.util.concurrent.TimeoutException;/*** @author :guo* @date :Created in 2025/3/20 15:00* @description:* @version:*/
public class Consumer02 {private static final String QUEUE_NAME="queue01";public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory factory=new ConnectionFactory();factory.setHost("xxxx");factory.setPort(5672);factory.setUsername("guest");factory.setPassword("guest");factory.setVirtualHost("/");Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.queueDeclare(QUEUE_NAME,true,false,false,null);channel.basicQos(1);Consumer consumer = new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("消費者2收到消息"+new String(body));}};//接收消息channel.basicConsume(QUEUE_NAME,true,consumer);}}

2.3發布訂閱模式 publish/subscribe

x? : 交換機

????????一方面,接收生產者發送的消息。另一方面,知道如何處理消息,例如遞交給某個特別隊列、遞交給所有隊列、或是將消息丟棄。到底如何操作,取決于Exchange的類型。Exchange有常見以下3種類型:

  1. Fanout:廣播,將消息交給所有綁定到交換機的隊列

  2. Direct:定向,把消息交給符合指定routing key 的隊列

  3. Topic:通配符,把消息交給符合routing pattern(路由模式) 的隊列

每個消費者都有自己獨立的隊列

2.3.1生產者

package com.ghx.work;import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;
import java.util.concurrent.TimeoutException;/*** @author :guo* @date :Created in 2025/3/20 11:35* @description:* @version:*/
public class Test01 {public static void main(String[] args) throws IOException, TimeoutException {//創建連接工廠ConnectionFactory factory=new ConnectionFactory();//rabbitmq服務器地址 默認本地localhostfactory.setHost("xxxx");//端口號 默認5672factory.setPort(5672);//用戶名 密碼  默認guestfactory.setUsername("guest");factory.setPassword("guest");factory.setVirtualHost("/");//創建連接對象Connection connection=factory.newConnection();//獲取channel對象Channel channel = connection.createChannel();//創建交換機
//        String exchange,交換機的名稱
//        BuiltinExchangeType type, 交換機的類型
//        boolean durable: 是否持久化channel.exchangeDeclare("fanout_exchange", BuiltinExchangeType.FANOUT,true);//創建隊列channel.queueDeclare("fanout_queue1",true,false,false,null);channel.queueDeclare("fanout_queue2",true,false,false,null);//綁定隊列和交換機
//        String queue,隊列名
//        String exchange,交換機名
//        String routingKey: 路由key 因為廣播模式沒有路由key  ""channel.queueBind("fanout_queue1","fanout_exchange","");channel.queueBind("fanout_queue2","fanout_exchange","");//發送消息String msg="hello fanout交換機";channel.basicPublish("fanout_exchange","",null,msg.getBytes());channel.close();connection.close();}
}

2.4路由模式routing

  • 隊列與交換機的綁定,不能是任意綁定了,而是要指定一個 RoutingKey(路由key)

  • 消息的發送方在向 Exchange 發送消息時,也必須指定消息的 RoutingKey

  • Exchange 不再把消息交給每一個綁定的隊列,而是根據消息的 Routing Key 進行判斷,只有隊列的Routingkey 與消息的 Routing key 完全一致,才會接收到消息

package com.ghx.router;import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;
import java.util.concurrent.TimeoutException;/*** @author :guo* @date :Created in 2025/3/20 11:35* @description:* @version:*/
public class Test01 {public static void main(String[] args) throws IOException, TimeoutException {//創建連接工廠ConnectionFactory factory=new ConnectionFactory();//rabbitmq服務器地址 默認本地localhostfactory.setHost("xxxx");//端口號 默認5672factory.setPort(5672);//用戶名 密碼  默認guestfactory.setUsername("guest");factory.setPassword("guest");factory.setVirtualHost("/");//創建連接對象Connection connection=factory.newConnection();//獲取channel對象Channel channel = connection.createChannel();//創建交換機
//        String exchange,交換機的名稱
//        BuiltinExchangeType type, 交換機的類型
//        boolean durable: 是否持久化channel.exchangeDeclare("direct_exchange", BuiltinExchangeType.DIRECT,true);//創建隊列channel.queueDeclare("direct_queue1",true,false,false,null);channel.queueDeclare("direct_queue2",true,false,false,null);//綁定隊列和交換機
//        String queue,隊列名
//        String exchange,交換機名
//        String routingKey: 路由key 因為廣播模式沒有路由key  ""channel.queueBind("direct_queue1","direct_exchange","error");channel.queueBind("direct_queue2","direct_exchange","error");channel.queueBind("direct_queue2","direct_exchange","info");channel.queueBind("direct_queue2","direct_exchange","warning");//發送消息String msg="hello direct交換機";channel.basicPublish("direct_exchange","info",null,msg.getBytes());channel.close();connection.close();}
}

2.5主題模式topics

  • Topic 類型與 Direct 相比,都是可以根據 RoutingKey 把消息路由到不同的隊列。只不過 Topic 類型Exchange 可以讓隊列在綁定 Routing key 的時候使用==通配符==!

  • Routingkey 一般都是有一個或多個單詞組成,多個單詞之間以”.”分割,例如: item.insert

  • 通配符規則:# 匹配一個或多個詞,* 匹配不多不少恰好1個詞,例如:item.# 能夠匹配 item.insert.abc 或者 item.insert,item.* 只能匹配 item.insert

下面的只會發送給2

package com.ghx.topic;import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;
import java.util.concurrent.TimeoutException;/*** @author :guo* @date :Created in 2025/3/20 11:35* @description:* @version:*/
public class Test01 {public static void main(String[] args) throws IOException, TimeoutException {//創建連接工廠ConnectionFactory factory=new ConnectionFactory();//rabbitmq服務器地址 默認本地localhostfactory.setHost("121.196.229.251");//端口號 默認5672factory.setPort(5672);//用戶名 密碼  默認guestfactory.setUsername("guest");factory.setPassword("guest");factory.setVirtualHost("/");//創建連接對象Connection connection=factory.newConnection();//獲取channel對象Channel channel = connection.createChannel();//創建交換機
//        String exchange,交換機的名稱
//        BuiltinExchangeType type, 交換機的類型
//        boolean durable: 是否持久化channel.exchangeDeclare("topic_exchange", BuiltinExchangeType.TOPIC,true);//創建隊列channel.queueDeclare("topic_queue1",true,false,false,null);channel.queueDeclare("topic_queue2",true,false,false,null);//綁定隊列和交換機
//        String queue,隊列名
//        String exchange,交換機名
//        String routingKey: 路由key 因為廣播模式沒有路由key  ""channel.queueBind("topic_queue1","topic_exchange","*.orange.*");channel.queueBind("topic_queue2","topic_exchange","*.*.rabbit");channel.queueBind("topic_queue2","topic_exchange","lazy.#");//發送消息String msg="hello topic交換機";channel.basicPublish("topic_exchange","lazy.orange",null,msg.getBytes());channel.close();connection.close();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73022.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73022.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73022.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

django怎么配置404和500

在 Django 中&#xff0c;配置 404 和 500 錯誤頁面需要以下步驟&#xff1a; 1. 創建自定義錯誤頁面模板 首先&#xff0c;創建兩個模板文件&#xff0c;分別用于 404 和 500 錯誤頁面。假設你的模板目錄是 templates/。 404 頁面模板 創建文件 templates/404.html&#x…

各類神經網絡學習:(四)RNN 循環神經網絡(下集),pytorch 版的 RNN 代碼編寫

上一篇下一篇RNN&#xff08;中集&#xff09;待編寫 代碼詳解 pytorch 官網主要有兩個可調用的模塊&#xff0c;分別是 nn.RNNCell 和 nn.RNN &#xff0c;下面會進行詳細講解。 RNN 的同步多對多、多對一、一對多等等結構都是由這兩個模塊實現的&#xff0c;只需要將對輸入…

深度學習篇---深度學習中的范數

文章目錄 前言一、向量范數1.L0范數1.1定義1.2計算式1.3特點1.4應用場景1.4.1特征選擇1.4.2壓縮感知 2.L1范數&#xff08;曼哈頓范數&#xff09;2.1定義2.2計算式2.3特點2.4應用場景2.4.1L1正則化2.4.2魯棒回歸 3.L2范數&#xff08;歐幾里得范數&#xff09;3.1定義3.2特點3…

星越L_燈光操作使用講解

目錄 1.開啟前照燈 2左右轉向燈、遠近燈 3.auto自動燈光 4.自適應遠近燈光 5.后霧燈 6.調節大燈高度 1.開啟前照燈 2左右轉向燈、遠近燈 3.auto自動燈光 系統根據光線自動開啟燈光

Stable Diffusion lora訓練(一)

一、不同維度的LoRA訓練步數建議 2D風格訓練 數據規模&#xff1a;建議20-50張高質量圖片&#xff08;分辨率≥10241024&#xff09;&#xff0c;覆蓋多角度、多表情的平面風格。步數范圍&#xff1a;總步數控制在1000-2000步&#xff0c;公式為 總步數 Repeat Image Epoch …

AI 生成 PPT 網站介紹與優缺點分析

隨著人工智能技術不斷發展&#xff0c;利用 AI 自動生成 PPT 已成為提高演示文稿制作效率的熱門方式。本文將介紹幾款主流的 AI PPT 工具&#xff0c;重點列出免費使用機會較多的網站&#xff0c;并對各平臺的優缺點進行詳細分析&#xff0c;幫助用戶根據自身需求選擇合適的工具…

使用Systemd管理ES服務進程

Centos中的Systemd介紹 CentOS 中的 Systemd 詳細介紹 Systemd 是 Linux 系統的初始化系統和服務管理器&#xff0c;自 CentOS 7 起取代了傳統的 SysVinit&#xff0c;成為默認的初始化工具。它負責系統啟動、服務管理、日志記錄等核心功能&#xff0c;顯著提升了系統的啟動速…

【一維前綴和與二維前綴和(簡單版dp)】

1.前綴和模板 一維前綴和模板 1.暴力解法 要求哪段區間&#xff0c;我就直接遍歷那段區間求和。 時間復雜度O(n*q) 2.前綴和 ------ 快速求出數組中某一個連續區間的和。 1&#xff09;預處理一個前綴和數組 這個前綴和數組設定為dp&#xff0c;dp[i]表示&#xff1a;表示…

在Windows和Linux系統上的Docker環境中使用的鏡像是否相同

在Windows和Linux系統上的Docker環境中使用的鏡像是否相同&#xff0c;取決于具體的運行模式和目標平臺&#xff1a; 1. Linux容器模式&#xff08;默認/常見場景&#xff09; Windows系統&#xff1a; 當Windows上的Docker以Linux容器模式運行時&#xff08;默認方式&#xf…

植物來源藥用天然產物的合成生物學研究進展-文獻精讀121

植物來源藥用天然產物的合成生物學研究進展 摘要 大多數藥用天然產物在植物中含量低微&#xff0c;提取分離困難&#xff1b;而且這些化合物一般結構復雜&#xff0c;化學合成難度大&#xff0c;還容易造成環境污染。基于合成生物學技術獲得藥用天然產物具有綠色環保和可持續發…

JavaScript |(五)DOM簡介 | 尚硅谷JavaScript基礎實戰

學習來源&#xff1a;尚硅谷JavaScript基礎&實戰丨JS入門到精通全套完整版 筆記來源&#xff1a;在這位大佬的基礎上添加了一些東西&#xff0c;歡迎大家支持原創&#xff0c;大佬太棒了&#xff1a;JavaScript |&#xff08;五&#xff09;DOM簡介 | 尚硅谷JavaScript基礎…

瀏覽器工作原理深度解析(階段二):HTML 解析與 DOM 樹構建

一、引言 在階段一中&#xff0c;我們了解了瀏覽器通過 HTTP/HTTPS 協議獲取頁面資源的過程。本階段將聚焦于瀏覽器如何解析 HTML 代碼并構建 DOM 樹&#xff0c;這是渲染引擎的核心功能之一。該過程可分為兩個關鍵步驟&#xff1a;詞法分析&#xff08;Token 化&#xff09;和…

The Illustrated Stable Diffusion

The Illustrated Stable Diffusion 1. The components of Stable Diffusion1.1. Image information creator1.2. Image Decoder 2. What is Diffusion anyway?2.1. How does Diffusion work?2.2. Painting images by removing noise 3. Speed Boost: Diffusion on compressed…

yarn 裝包時 package里包含sqlite3@5.0.2報錯

yarn 裝包時 package里包含sqlite35.0.2報錯 解決方案&#xff1a; 第一步&#xff1a; 刪除package.json里的sqlite35.0.2 第二步&#xff1a; 裝包&#xff0c;或者增加其他的npm包 第三步&#xff1a; 在package.json里增加sqlite35.0.2&#xff0c;并運行yarn裝包 此…

一個免費 好用的pdf在線處理工具

pdf24 doc2x 相比上面能更好的支持數學公式。但是收費

buu-bjdctf_2020_babystack2-好久不見51

整數溢出漏洞 將nbytes設置為-1就會回繞&#xff0c;變成超大整數 從而實現棧溢出漏洞 環境有問題 from pwn import *# 連接到遠程服務器 p remote("node5.buuoj.cn", 28526)# 定義后門地址 backdoor 0x400726# 發送初始輸入 p.sendlineafter(b"your name…

DHCP 配置

? 最近發現&#xff0c;自己使用虛擬機建立的集群&#xff0c;在斷電關機或者關機一段時間后&#xff0c;集群之間的鏈接散了&#xff0c;并且節點自身的 IP 也發生了變化&#xff0c;發現是 DHCP 的問題&#xff0c;這里記錄一下。 DHCP ? DHCP&#xff08;Dynamic Host C…

股指期貨合約的命名規則是怎樣的?

股指期貨合約的命名規則其實很簡單&#xff0c;主要由兩部分組成&#xff1a;合約代碼和到期月份。 股指期貨合約4個字母數字背后的秘密 股指期貨合約一般來說都是由字母和數字來組合的&#xff0c;包含了品種代碼和到期的時間&#xff0c;下面我們具體來看看。 咱們以“IF23…

OSPF 協議詳解:從概念原理到配置實踐的全網互通實現

什么是OSPF OSPF&#xff08;開放最短路徑優先&#xff09;是由IETF開發的基于鏈路狀態的自治系統內部路由協議&#xff0c;用來代替存在一些問題的RIP協議。與距離矢量協議不同&#xff0c;鏈路狀態路由協議關心網絡中鏈路活接口的狀態&#xff08;包括UP、DOWN、IP地址、掩碼…

深入探究 JVM 堆的垃圾回收機制(二)— 回收

GC Roots 枚舉需要遍歷整個應用程序的上下文&#xff0c;而在進行可達性分析或者垃圾回收時&#xff0c;如果我們還是進行全堆掃描及收集&#xff0c;那么會非常耗時。JVM 將堆分為新生代及老生代&#xff0c;它們的回收頻率及算法不一樣。 1 回收算法 在進行可達性分析時&am…