Java內存管理與性能優化實踐

Java內存管理與性能優化實踐

Java作為一種廣泛使用的編程語言,其內存管理和性能優化是開發者在日常工作中需要深入了解的重要內容。Java的內存管理機制借助于垃圾回收(GC)來自動處理內存的分配和釋放,但要實現高效的內存管理和優化性能,開發者仍然需要深入理解Java的內存模型、垃圾回收機制以及常見的性能瓶頸。

本文將詳細探討Java內存管理的基本原理,并通過實際的性能優化實踐,幫助開發者在開發過程中提升應用的效率。

1. Java內存管理基礎

Java的內存管理機制可以歸納為幾個關鍵組件,分別是堆內存、棧內存、方法區(包括類加載器和JVM內部的常量池)等。理解這些組件的內存分配和回收機制,對于開發高效的Java應用至關重要。

1.1 堆內存與棧內存

Java中的內存分為兩大主要區域:堆(Heap)和棧(Stack)。這兩個區域分別承擔不同的功能:

  • 堆內存:用于存儲對象及其屬性,堆內存是Java內存管理的核心區域,垃圾回收器主要對堆內存進行管理。
  • 棧內存:用于存儲局部變量和方法調用的棧幀。棧內存是線程私有的,每個線程都會有自己的棧空間。

1.2 Java的垃圾回收機制

Java的垃圾回收(GC)是自動管理內存的核心機制。GC主要通過標記-清除、復制、標記-整理等算法來回收無用的對象,避免內存泄漏。

  • 標記-清除算法:標記所有可達對象,然后清除未標記的對象。
  • 復制算法:將內存分為兩個區域,每次只使用一個區域,回收時將存活的對象復制到另一區域。
  • 標記-整理算法:與標記-清除相似,但在清理后進行整理,減少內存碎片。

在JVM中,GC的實現是分代進行的,堆內存被劃分為新生代、老年代和永久代(在JVM 8以后,永久代被元空間替代)。

2. 性能優化策略

在開發Java應用時,性能優化往往依賴于對內存的合理管理和垃圾回收機制的理解。以下是幾種常見的優化策略:

2.1 減少GC頻率和停頓時間

垃圾回收頻率和停頓時間是影響應用性能的關鍵因素。頻繁的GC會增加系統的負擔,導致性能下降。為了減少GC的影響,可以采取以下措施:

  • 對象池化:通過對象池技術,復用對象而非頻繁創建和銷毀對象,減少GC的壓力。
  • 手動管理內存:盡量避免創建過多的臨時對象,特別是在循環中。
  • 合理設置JVM參數:通過調整JVM的堆內存大小、GC類型等來優化垃圾回收的效率。
示例:調整JVM參數

在啟動應用時,可以通過以下JVM參數調整垃圾回收的行為:

java -Xms1024m -Xmx2048m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar myapp.jar
  • -Xms1024m:設置JVM初始堆內存為1024MB。
  • -Xmx2048m:設置JVM最大堆內存為2048MB。
  • -XX:+UseG1GC:啟用G1垃圾回收器。
  • -XX:MaxGCPauseMillis=200:設置最大GC暫停時間為200毫秒。

2.2 內存泄漏的檢測與防止

內存泄漏是指程序無法釋放不再使用的對象,導致內存消耗逐漸增加。常見的內存泄漏原因包括:

  • 靜態集合類:靜態集合類持有大量對象,且沒有及時清理,可能導致內存泄漏。
  • 事件監聽器未移除:對象注冊了事件監聽器,但在不再需要時沒有移除,導致對象無法被GC回收。
  • 內存泄漏檢測工具:可以使用工具如VisualVM、JProfiler、MAT(Memory Analyzer Tool)來分析內存泄漏。
示例:防止靜態集合類導致內存泄漏
public class Cache {private static Map<String, Object> cache = new HashMap<>();public static void put(String key, Object value) {cache.put(key, value);}public static Object get(String key) {return cache.get(key);}public static void remove(String key) {cache.remove(key);}
}

上述代碼中,cache是一個靜態字段,它會導致緩存數據無法被GC回收。如果沒有顯式地調用remove方法移除緩存中的對象,就可能造成內存泄漏。使用WeakHashMap代替HashMap可以防止內存泄漏。

2.3 優化堆內存分配

合理分配堆內存大小對于提高Java應用的性能至關重要。堆內存過大或過小都可能導致性能問題。

  • 過大:JVM會使用更多的內存,GC暫停時間增加,且可能會頻繁發生Full GC。
  • 過小:頻繁進行Young GC,導致響應時間變慢。

通過合理設置JVM參數,進行堆內存的調優:

java -Xms512m -Xmx2048m -XX:+UseG1GC -XX:NewSize=512m -jar myapp.jar
  • -Xms512m:設置初始堆內存為512MB。
  • -Xmx2048m:設置最大堆內存為2048MB。
  • -XX:NewSize=512m:設置新生代大小為512MB。

2.4 使用合適的數據結構

選擇合適的數據結構對內存的使用和程序的執行效率有重要影響。例如,使用ArrayList替代LinkedList來減少內存消耗和提高訪問速度,使用HashMap替代TreeMap來提高查找效率等。

示例:優化內存使用
// 使用ArrayList代替LinkedList來減少內存消耗
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 1000; i++) {list.add(i);
}// 使用HashMap代替TreeMap來提高查找效率
Map<Integer, String> map = new HashMap<>();
for (int i = 0; i < 1000; i++) {map.put(i, "value" + i);
}

通過選擇適合的集合類,可以減少內存占用并提高程序的性能。

2.5 JVM性能調優工具

在Java應用中進行性能優化時,合理使用JVM調優工具是必不可少的。以下是幾款常用的JVM性能分析工具:

  • jvisualvm:用于監控JVM的性能、內存使用情況和線程活動。
  • jprofiler:強大的性能分析工具,可以用于分析內存泄漏、CPU性能瓶頸等問題。
  • MAT(Memory Analyzer Tool):用于分析堆轉儲文件,檢測內存泄漏。

3. 實踐案例:優化一個Java Web應用

假設我們有一個Java Web應用,需要對其進行內存管理和性能優化。以下是優化步驟:

  1. 分析GC日志:啟用GC日志,查看GC頻率和停頓時間。
java -Xlog:gc* -jar mywebapp.jar
  1. 調整堆內存參數:根據GC日志分析結果,調整堆內存的初始和最大值。
java -Xms1024m -Xmx2048m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar mywebapp.jar
  1. 優化數據庫連接池:確保數據庫連接池大小適中,避免過多連接占用內存。
  2. 減少對象創建:避免在頻繁調用的方法中創建臨時對象,使用對象池技術重用對象。
  3. 內存泄漏檢查:使用VisualVM檢查內存泄漏,識別并修復靜態集合類和事件監聽器問題。

4. 實踐案例:優化一個Java Web應用

假設我們有一個Java Web應用,該應用在高并發情況下表現出內存不足和響應緩慢的現象。我們將通過以下幾個步驟來優化內存管理與性能,提升系統的穩定性和響應速度。

4.1 啟用并分析GC日志

GC日志能夠幫助我們了解垃圾回收的行為及其對應用性能的影響。通過分析GC日志,可以確定GC發生的頻率、停頓時間和堆內存使用情況,從而優化堆大小及GC策略。

首先,啟用GC日志:

java -Xlog:gc* -jar mywebapp.jar

通過查看GC日志,分析以下幾個關鍵數據點:

  • GC頻率:頻繁的Full GC可能意味著堆內存設置過小,或者有大量的臨時對象產生。
  • GC停頓時間:如果GC停頓時間過長,可能導致應用響應延遲。可以通過調整JVM參數(如-XX:MaxGCPauseMillis)來優化停頓時間。
  • 堆內存使用情況:GC日志能夠幫助我們分析堆內存是否已充分利用,并決定是否需要調整堆內存的大小。

4.2 調整堆內存參數

通過GC日志的分析結果,我們可以決定堆內存的初始大小和最大值。在我們的案例中,我們通過調整堆內存來減少GC的頻率和停頓時間。

假設GC日志顯示頻繁發生Full GC,且堆內存大小較小,可以將堆內存的初始大小(-Xms)和最大大小(-Xmx)增加,并使用G1垃圾回收器以減少停頓時間。

java -Xms2048m -Xmx4096m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar mywebapp.jar
  • -Xms2048m:設置JVM初始堆內存為2048MB。
  • -Xmx4096m:設置JVM最大堆內存為4096MB。
  • -XX:+UseG1GC:啟用G1垃圾回收器,它在低延遲和高吞吐量之間做出平衡。
  • -XX:MaxGCPauseMillis=200:將GC停頓時間限制為200毫秒以內,幫助提高應用的響應性。

4.3 優化數據庫連接池

數據庫連接池是一個常見的性能瓶頸。在Web應用中,數據庫連接的創建和銷毀會耗費大量的資源。合理配置數據庫連接池,可以減少連接的開銷,提升數據庫訪問性能。

我們可以使用常見的數據庫連接池庫,如HikariCP、C3P0等。下面是使用HikariCP配置數據庫連接池的示例:

<!-- 在application.properties中配置HikariCP -->
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=50
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.max-lifetime=600000
  • minimum-idle:池中最小的空閑連接數。設置為10意味著即使連接池中沒有請求,連接池也會保持10個連接空閑。
  • maximum-pool-size:連接池的最大連接數,設置為50意味著最多可以有50個數據庫連接同時處于活動狀態。
  • idle-timeout:連接在池中空閑時的最大時間,超過該時間會被回收。
  • max-lifetime:連接的最大生命周期,超過該時間會被關閉并重新創建。

通過適當配置數據庫連接池,可以有效減少數據庫連接的創建與銷毀開銷,提高數據庫訪問效率,進而提升整體應用性能。

4.4 減少臨時對象的創建

在Java中,頻繁地創建臨時對象會增加GC的負擔,導致內存占用過高。為了減少GC的頻繁觸發,我們需要盡量避免在循環或高頻調用的方法中創建臨時對象。

示例:優化循環中的對象創建
// 不優化的代碼:每次循環都創建一個新的String對象
for (int i = 0; i < 1000; i++) {String result = "Item " + i;process(result);
}// 優化后的代碼:避免在循環中頻繁創建對象
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {sb.setLength(0); // 清空緩存區sb.append("Item ").append(i);process(sb.toString());
}

在優化后的代碼中,我們避免在每次循環時創建新的String對象,而是重用StringBuilder來構造字符串。這種優化減少了對象的創建和GC的負擔。

4.5 監控并優化線程池

高并發應用中,線程池的使用至關重要。合理配置線程池的大小可以避免線程的頻繁創建與銷毀,減少系統資源的消耗,同時避免線程饑餓(線程數過少)或線程阻塞(線程數過多)。

我們可以使用Executors來創建線程池,并根據業務需求設置合理的線程池參數:

// 使用ThreadPoolExecutor創建自定義線程池
int corePoolSize = 10;
int maxPoolSize = 50;
long keepAliveTime = 60L;
TimeUnit unit = TimeUnit.SECONDS;ExecutorService executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, unit, new LinkedBlockingQueue<>()
);// 提交任務
executor.submit(() -> {// 執行任務
});
  • corePoolSize:核心池大小,線程池中始終保持的線程數。
  • maxPoolSize:最大線程數,線程池能夠容納的最大線程數。
  • keepAliveTime:當線程池中的線程空閑時,保持的最大時間。

通過合理配置線程池的大小,可以提高線程的復用性,減少線程創建和銷毀的開銷,從而提升應用的性能。

4.6 內存泄漏的檢查與修復

內存泄漏是影響Java應用性能的常見問題,尤其是在高并發和長時間運行的應用中。Java內存泄漏通常發生在對象未能及時釋放,導致它們一直占用內存空間。

使用VisualVM等工具可以幫助我們監測應用的內存使用情況并定位內存泄漏。

  • 常見的內存泄漏原因

    • 靜態集合類持有大量對象,未能及時清理。
    • 事件監聽器未解除注冊。
    • 使用不當的第三方庫,導致對象引用未被釋放。
示例:檢測內存泄漏
// 內存泄漏示例:靜態集合類導致的內存泄漏
public class Cache {private static Map<String, Object> cache = new HashMap<>();public static void addToCache(String key, Object value) {cache.put(key, value);}public static Object getFromCache(String key) {return cache.get(key);}
}

在上述代碼中,Cache類的cache是一個靜態成員,它會一直持有對添加到緩存中的對象的引用。如果不定期清理這些對象,cache將不斷增長,最終導致內存泄漏。

為了解決這個問題,可以使用WeakHashMap來代替HashMap,從而使得緩存中的對象能夠在沒有強引用時被GC回收:

public class Cache {private static Map<String, Object> cache = new WeakHashMap<>();public static void addToCache(String key, Object value) {cache.put(key, value);}public static Object getFromCache(String key) {return cache.get(key);}
}

WeakHashMap中的對象在沒有強引用時會被GC回收,從而避免了內存泄漏問題。

5. 高效的垃圾回收調優

隨著應用的復雜度增加,垃圾回收的調優變得尤為重要。通過選擇合適的垃圾回收策略,可以有效降低GC的開銷,提高應用的性能。

常用的垃圾回收器有:

  • Serial GC:適用于單核機器或內存較小的系統,適用于小型應用。
  • Parallel GC:適用于多核機器,能夠充分利用CPU資源,適合處理高吞吐量任務。
  • G1 GC:適用于大內存、高并發的系統,能夠提供較低的GC停頓時間和較好的吞吐量。
  • ZGC(Z Garbage Collector)和Shenandoah GC:低延遲的垃圾回收器,適用于需要響應時間低的應用。

可以根據實際需求選擇適合的GC策略,并通過-XX:+PrintGCDetails來打印GC日志,以便進一步分析和優化。

6. JVM性能監控與調優工具

在Java應用的性能優化過程中,JVM性能監控和調優工具是不可或缺的,它們可以幫助開發者深入分析內存使用、GC行為、線程活動等,從而找出性能瓶頸并進行有效的優化。

6.1 使用JVM工具分析GC和內存

VisualVM

VisualVM是JVM的一種圖形化監控工具,能夠幫助開發者查看JVM的運行狀態,包括內存、線程、垃圾回收等信息。它可以連接到正在運行的JVM進程,并提供如下功能:

  • 內存分析:查看堆內存使用情況,幫助發現內存泄漏。
  • CPU分析:查看CPU使用率,識別CPU占用高的線程。
  • 線程分析:查看線程的狀態和活動,幫助找出阻塞的線程。

啟動VisualVM并連接到JVM后,可以通過以下步驟分析GC和內存:

  1. 監控堆內存:點擊Heap Dump,分析堆內存使用情況和對象分布。
  2. GC監控:通過GC選項查看垃圾回收日志,分析GC頻率和停頓時間。
  3. 查看線程狀態:在Threads標簽頁中查看當前線程狀態,定位線程饑餓和死鎖問題。
jstat

jstat是JVM自帶的一個命令行工具,主要用于監控JVM的性能指標,如垃圾回收情況、堆內存使用等。它可以實時輸出堆內存、垃圾回收統計數據,幫助開發者了解JVM的運行狀態。

例如,使用以下命令來監控GC信息:

jstat -gcutil <pid> 1000
  • <pid>:JVM進程的ID。
  • 1000:表示每秒輸出一次統計信息。

這將輸出類似以下信息:

 S0C    S1C    S0U    S1U    EC      EU     OC     OU     YGC    YGCT    FGC    FGCT    GCT1024.0 1024.0 0.0    0.0    8192.0  500.0  4096.0  1024.0 10     0.005   2     0.05    0.055

這些數據顯示了不同內存區域的使用情況,幫助我們分析GC的頻率和堆的使用情況。

6.2 使用JProfiler進行深度分析

JProfiler是一款強大的Java性能分析工具,專門用于分析內存、CPU、線程等性能瓶頸。它提供了對堆內存使用、內存泄漏、CPU消耗等方面的詳細分析,適合用來做深度性能優化。

內存分析

JProfiler可以通過堆轉儲分析來幫助我們定位內存泄漏。它允許開發者:

  • 查看對象分配:分析哪些類的對象最占用內存。
  • 查看對象引用鏈:跟蹤對象的引用路徑,找出導致內存泄漏的根本原因。
  • 堆轉儲:導出堆轉儲文件進行后期分析。
CPU分析

通過JProfiler的CPU分析功能,可以深入查看應用中哪些方法調用最占用CPU。它提供了詳細的堆棧跟蹤信息,幫助定位性能瓶頸。

分析線程

JProfiler還能夠監控線程的活動,分析線程的生命周期和阻塞情況,找出潛在的線程問題,如死鎖和線程饑餓。

6.3 使用Prometheus和Grafana進行JVM監控

Prometheus和Grafana是現代分布式應用監控的標配工具,特別適用于監控Java微服務和高并發應用。我們可以通過jmx_exporter將JVM指標暴露給Prometheus,然后使用Grafana可視化這些指標。

配置Prometheus與JMX Exporter

首先,下載并配置jmx_exporter,將JVM指標暴露到Prometheus:

java -javaagent:/path/to/jmx_exporter.jar=9404:/path/to/jmx_exporter_config.yaml -jar myapp.jar
  • 9404是暴露JVM指標的端口。
  • jmx_exporter_config.yaml是JMX Exporter的配置文件。

然后,通過Prometheus拉取JVM指標,配置Prometheus與Grafana來展示這些數據,例如:

scrape_configs:- job_name: 'java'static_configs:- targets: ['localhost:9404']

通過Grafana的Dashboard,可以直觀地看到內存使用情況、垃圾回收時間、線程活動等指標。

7. 高效的垃圾回收調優

垃圾回收(GC)是JVM性能優化的關鍵之一,GC的調優可以顯著減少應用的響應時間,提升系統的吞吐量。以下是幾個常見的垃圾回收調優方法:

7.1 選擇合適的垃圾回收器

JVM提供了多種垃圾回收器,每種回收器適用于不同的場景。選擇合適的垃圾回收器可以提高GC效率,減少GC停頓時間。

  • Serial GC:適合單核機器或內存較小的應用,優點是實現簡單,缺點是并發性能差。
  • Parallel GC:適用于多核機器,能夠提供更好的吞吐量,適用于批處理或非實時應用。
  • G1 GC:適用于大內存、低延遲的應用,能夠控制GC停頓時間,適合需要高響應的應用。
  • ZGC/Shenandoah:新一代低延遲垃圾回收器,適用于對響應時間要求極高的應用。

可以通過JVM啟動參數選擇適合的垃圾回收器,例如:

java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar myapp.jar

7.2 調整GC暫停時間

JVM的GC停頓時間會直接影響應用的響應時間,特別是在高并發和大內存應用中。通過調整MaxGCPauseMillisG1HeapRegionSize等參數,可以控制GC的停頓時間。

  • MaxGCPauseMillis:設置最大GC停頓時間,JVM會盡力在此時間內完成GC,適用于低延遲要求的應用。
  • G1HeapRegionSize:調整G1 GC區域的大小,優化GC的內存分配。
java -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1HeapRegionSize=8m -jar myapp.jar

通過這些參數的調整,可以實現較低的GC停頓時間,保證系統的響應能力。

7.3 調整堆內存大小

堆內存的大小直接影響GC的效率。較小的堆內存可能導致頻繁的GC,較大的堆內存可能導致Full GC時的長時間停頓。我們需要根據應用的內存需求來調整堆內存的大小。

通過以下參數可以設置堆內存的初始大小和最大大小:

java -Xms1024m -Xmx2048m -XX:+UseG1GC -jar myapp.jar
  • -Xms1024m:設置初始堆內存為1024MB。
  • -Xmx2048m:設置最大堆內存為2048MB。

通過調整堆的大小,可以避免頻繁的Young GC和Full GC,從而提升應用性能。

8. 使用JVM日志分析工具

JVM日志分析工具能夠幫助開發者深入了解JVM的運行情況,特別是在GC調優和內存管理方面。

8.1 GC日志分析

GC日志記錄了垃圾回收的詳細信息,包括GC的類型、停頓時間、堆內存的使用情況等。使用GC日志分析工具,如GCViewerJClarity等,可以幫助我們識別性能瓶頸。

啟用GC日志

使用以下JVM參數啟用GC日志:

java -Xlog:gc* -jar myapp.jar

通過GC日志,我們可以分析出GC頻率、停頓時間、堆內存使用等指標,從而進行優化。

總結

Java內存管理與性能優化是確保高效、可擴展應用的關鍵因素。本文深入探討了Java內存管理的核心概念、常見的內存優化策略,以及通過具體實踐案例如何提升應用性能。以下是本篇文章的主要內容總結:

  1. 內存管理基礎
    • 堆內存與非堆內存:了解堆內存、方法區、直接內存等內存區域的分配與使用。
    • 垃圾回收(GC)機制:分析GC的工作原理,及其對應用性能的影響。
  2. 性能優化實踐
    • 通過啟用GC日志和分析堆內存使用情況,合理調整堆大小,選擇適合的垃圾回收器來減少停頓時間。
    • 優化數據庫連接池、線程池等資源的配置,以提高應用的吞吐量和響應速度。
    • 避免頻繁的對象創建,通過重用對象和使用合適的數據結構,減少內存消耗和GC的負擔。
  3. 監控與分析工具
    • VisualVMJProfilerPrometheusGrafana等工具可以幫助開發者實時監控JVM的內存使用、GC行為、線程活動等,提供深入的性能分析。
    • GC日志分析工具(如GCViewer、JClarity)能夠幫助開發者識別GC瓶頸并優化GC策略。
  4. 垃圾回收調優
    • 選擇適合的垃圾回收器(如G1、ZGC等)根據應用需求調整GC策略,以減少GC停頓時間并優化內存利用。
    • 調整堆內存大小,控制GC的頻率與停頓時間,避免Full GC和過度的內存消耗。
  5. 內存泄漏的監控與修復
    • 使用堆轉儲分析工具,如VisualVMJProfiler等,檢測內存泄漏的根本原因,并通過改進代碼結構(如使用WeakHashMap)來避免內存泄漏問題。

通過對JVM內存管理和性能優化的深入理解及實踐,開發者可以有效地提升應用性能,避免內存瓶頸和GC問題,從而確保Java應用的高效運行。

在這里插入圖片描述

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

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

相關文章

代碼隨想錄算法訓練營第三十天 | 卡碼網46.攜帶研究材料(二維解法)、卡碼網46.攜帶研究材料(滾動數組)、LeetCode416.分割等和子集

代碼隨想錄算法訓練營第三十天 | 卡碼網46.攜帶研究材料&#xff08;二維解法&#xff09;、卡碼網46.攜帶研究材料&#xff08;滾動數組&#xff09;、LeetCode416.分割等和子集 01-1 卡碼網46.攜帶研究材料&#xff08;二維&#xff09; 相關資源 題目鏈接&#xff1a;46. 攜…

nvidia驅動更新,centos下安裝openwebui+ollama(非docker)

查看centos內核版本 uname -a cat /etc/redhat-release下載對應的程序&#xff08;這個是linux64位版本通用的&#xff09; https://cn.download.nvidia.cn/tesla/550.144.03/NVIDIA-Linux-x86_64-550.144.03.run cudnn想辦法自己下一下&#xff0c;我這里是12.x和11.x通用的…

【AIGC系列】4:Stable Diffusion應用實踐和代碼分析

AIGC系列博文&#xff1a; 【AIGC系列】1&#xff1a;自編碼器&#xff08;AutoEncoder, AE&#xff09; 【AIGC系列】2&#xff1a;DALLE 2模型介紹&#xff08;內含擴散模型介紹&#xff09; 【AIGC系列】3&#xff1a;Stable Diffusion模型原理介紹 【AIGC系列】4&#xff1…

51單片機-串口通信編程

串行口工作之前&#xff0c;應對其進行初始化&#xff0c;主要是設置產生波特率的定時器1、串行口控制盒中斷控制。具體步驟如下&#xff1a; 確定T1的工作方式&#xff08;編程TMOD寄存器&#xff09;計算T1的初值&#xff0c;裝載TH1\TL1啟動T1&#xff08;編程TCON中的TR1位…

Windows 10 遠程桌面連接使用指南

目錄 一、引言 二、準備工作 1、確認系統版本 2、服務器端設置 三、客戶端連接 1、打開遠程桌面連接程序 2、輸入連接信息 3、輸入登錄憑證 4、開始使用遠程桌面 四、移動端連接&#xff08;以 iOS 為例&#xff09; 1、下載安裝應用 2、添加遠程計算機 3、進行連接…

spring boot打包插件的問題

在spring boot項目中聲明了 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build> 執行mvn clean package&…

R語言+AI提示詞:貝葉斯廣義線性混合效應模型GLMM生物學Meta分析

全文鏈接&#xff1a;https://tecdat.cn/?p40797 本文旨在幫助0基礎或只有簡單編程基礎的研究學者&#xff0c;通過 AI 的提示詞工程&#xff0c;使用 R 語言完成元分析&#xff0c;包括數據處理、模型構建、評估以及結果解讀等步驟&#xff08;點擊文末“閱讀原文”獲取完整代…

iOS UICollectionViewCell 點擊事件自動化埋點

iOS 中經常要進行埋點&#xff0c;我們這里支持 UICollectionViewCell. 進行自動化埋點&#xff0c;思路&#xff1a; 通過hook UICollectionViewCell 的setSelected:方法&#xff0c; 則新的方法中執行埋點邏輯&#xff0c;并調用原來的方法 直接上代碼 implementation UICol…

課程《MIT Introduction to Deep Learning》

在Youtubu上&#xff0c;MIT Introduction to Deep Learning (2024) | 6.S191 共8節課&#xff1a; (1) MIT Introduction to Deep Learning (2024) | 6.S191 (2) MIT 6.S191: Recurrent Neural Networks, Transformers, and Attention (3) MIT 6.S191: Convolutional Neural N…

Docker 學習(一)

一、Docker 核心概念 Docker 是一個開源的容器化平臺&#xff0c;允許開發者將應用及其所有依賴&#xff08;代碼、運行時、系統工具、庫等&#xff09;打包成一個輕量級、可移植的“容器”&#xff0c;實現 “一次構建&#xff0c;隨處運行”。 1、容器&#xff08;Container…

007 訂單支付超時自動取消訂單(rabbitmq死信隊列 mybatis)

文章目錄 死信隊列RabbitMQ 配置類 RabbitMQConfig.java生產者 OrderTimeoutProducer.java消費者 OrderTimeoutConsumer.java應用配置 application.ymlpom.xml 依賴實體類 Order.java&#xff08;不變&#xff09;Mapper 接口 OrderMapper.java&#xff08;不變&#xff09;服務…

計算機畢業設計SpringBoot+Vue.js智慧圖書管理系統(源碼+文檔+PPT+講解)

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

《論數據分片技術及其應用》審題技巧 - 系統架構設計師

論數據分片技術及其應用寫作框架 一、考點概述 本論題“論數據分片技術及其應用”主要考察的是軟件工程中數據分片技術的理解、應用及其實際效果分析。考點涵蓋以下幾個方面&#xff1a; 首先&#xff0c;考生需對數據分片的基本概念有清晰的認識&#xff0c;理解數據分片是…

【每日學點HarmnoyOS Next知識】web加載pdf、Toggle禁用、Grid多次渲染問題、Web判斷是否存在title、 List側滑欄關閉

【每日學點HarmnoyOS Next知識】web加載pdf、Toggle禁用、Grid多次渲染問題、Web判斷是否存在title、 List側滑欄關閉 1、HarmonyOS Web組件加載本地pdf文件后&#xff0c;默認顯示標題和下載按鈕&#xff0c;可以隱藏或者有對應的操作這個title的API嗎&#xff1f; 隱藏PDF操…

下載 MindSpore 配置 PyTorch環境

以下是下載 MindSpore 并配置 PyTorch 環境的詳細步驟&#xff0c;適用于常見的 Linux/Windows 系統&#xff08;以 NVIDIA GPU 為例&#xff09;&#xff1a; 一、環境準備 1. 硬件與軟件檢查 GPU 支持&#xff1a;確保使用 NVIDIA 顯卡&#xff0c;通過 nvidia-smi 查看驅動…

三、數據提取

利用 requests 可以獲取網站頁面數據&#xff0c;但是 requests 返回的數據中包含了一些冗余數據&#xff0c;我們需要在這些數據集中提取自己需要的信息。所以我們要學會在數據集中提取自己需要的數據。 需要掌握的知識點如下&#xff1a; json 數據提取 jsonpath 語法 靜態…

Qt | 實戰繼承自QObject的IOThread子類實現TCP客戶端(安全銷毀)

點擊上方"藍字"關注我們 01、QThread >>> start() 啟動線程,調用后會執行 run() 方法。 run() 線程的入口點,子類化 QThread 時需要重寫此方法以定義線程的執行邏輯。 quit() 請求線程退出,線程會在事件循環結束后終止。 exit(int returnCode = 0) 退出…

int new_pos = (pos + delta + 9) % 9 化曲為直算法

公式 int new_pos (pos delta 9) % 9; 是一個常見的 循環數組索引計算 方法&#xff0c;用于處理圓圈排列中的位置計算。這個公式可以總結出一個普遍的規律&#xff0c;適用于任何循環數組或圓圈排列的場景。 普遍規律 假設有一個長度為 ( n ) 的循環數組&#xff08;或圓圈…

生成一個日期時間序列,從‘2024-12-03‘開始,每小時遞增 oracle 轉為達夢

-------------------------------生成一個日期時間序列&#xff0c;從2024-12-03開始&#xff0c;每小時遞增---------------------------- ---原oracle : SELECT to_date(2024-12-03, yyyy-mm-dd) (ROWNUM - 1) / 24 data_time FROM dual CO…

前端學習——HTML

VSCode常用快捷鍵 代碼格式化&#xff1a;ShiftAltF 向上或向下移動一行&#xff1a;AltUp或AltDown 快速復制一行代碼&#xff1a;ShiftAltUp或者ShiftAltDown 快速替換&#xff1a;CtrlH HTML標簽 文本標簽 定義著重文字 定義粗體文字 定義斜體文字 加重語氣 刪除字 無特…