JVM監控及診斷工具-命令行篇

18.1. 概述

性能診斷是軟件工程師在日常工作中需要經常面對和解決的問題,在用戶體驗至上的今天,解決好應用的性能問題能帶來非常大的收益。

Java 作為最流行的編程語言之一,其應用性能診斷一直受到業界廣泛關注。可能造成 Java 應用出現性能問題的因素非常多,例如線程控制、磁盤讀寫、數據庫訪問、網絡I/O、垃圾收集等。想要定位這些問題,一款優秀的性能診斷工具必不可少。

體會1:使用數據說明問題,使用知識分析問題,使用工具處理問題。

體會2:無監控、不調優!

簡單命令行工具

在我們剛接觸java學習的時候,大家肯定最先了解的兩個命令就是javac,java,那么除此之外,還有沒有其他的命令可以供我們使用呢?

我們進入到安裝jdk的bin目錄,發現還有一系列輔助工具。這些輔助工具用來獲取目標 JVM 不同方面、不同層次的信息,幫助開發人員很好地解決Java應用程序的一些疑難雜癥。

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

20210504195838.png

官方源碼地址:http://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/jdk.jcmd/share/classes/sun/tools

18.2. jps:查看正在運行的Java進程

jps(Java Process Status):顯示指定系統內所有的HotSpot虛擬機進程(查看虛擬機進程信息),可用于查詢正在運行的虛擬機進程。

說明:對于本地虛擬機進程來說,進程的本地虛擬機ID與操作系統的進程ID是一致的,是唯一的。

基本使用語法為:jps [options] [hostid]

我們還可以通過追加參數,來打印額外的信息。

options參數

  • -q:僅僅顯示LVMID(local virtual machine id),即本地虛擬機唯一id。不顯示主類的名稱等
  • -l:輸出應用程序主類的全類名 或 如果進程執行的是jar包,則輸出jar完整路徑
  • -m:輸出虛擬機進程啟動時傳遞給主類main()的參數
  • -v:列出虛擬機進程啟動時的JVM參數。比如:-Xms20m -Xmx50m是啟動程序指定的jvm參數。

說明:以上參數可以綜合使用。

補充:如果某 Java 進程關閉了默認開啟的UsePerfData參數(即使用參數-XX:-UsePerfData),那么jps命令(以及下面介紹的jstat)將無法探知該Java 進程。

hostid參數

RMI注冊表中注冊的主機名。如果想要遠程監控主機上的 java 程序,需要安裝 jstatd。

對于具有更嚴格的安全實踐的網絡場所而言,可能使用一個自定義的策略文件來顯示對特定的可信主機或網絡的訪問,盡管這種技術容易受到IP地址欺詐攻擊。

如果安全問題無法使用一個定制的策略文件來處理,那么最安全的操作是不運行jstatd服務器,而是在本地使用jstat和jps工具。

18.3. jstat:查看JVM統計信息

jstat(JVM Statistics Monitoring Tool):用于監視虛擬機各種運行狀態信息的命令行工具。它可以顯示本地或者遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據。在沒有GUI圖形界面,只提供了純文本控制臺環境的服務器上,它將是運行期定位虛擬機性能問題的首選工具。常用于檢測垃圾回收問題以及內存泄漏問題。

官方文檔:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html

基本使用語法為:jstat - [-t] [-h] [ []]

查看命令相關參數:jstat-h 或 jstat-help

其中vmid是進程id號,也就是jps之后看到的前面的號碼,如下:

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

option參數

選項option可以由以下值構成。

類裝載相關的:

  • -class:顯示ClassLoader的相關信息:類的裝載、卸載數量、總空間、類裝載所消耗的時間等

垃圾回收相關的:

  • -gc:顯示與GC相關的堆信息。包括Eden區、兩個Survivor區、老年代、永久代等的容量、已用空間、GC時間合計等信息。
  • -gccapacity:顯示內容與-gc基本相同,但輸出主要關注Java堆各個區域使用到的最大、最小空間。
  • -gcutil:顯示內容與-gc基本相同,但輸出主要關注已使用空間占總空間的百分比。
  • -gccause:與-gcutil功能一樣,但是會額外輸出導致最后一次或當前正在發生的GC產生的原因。
  • -gcnew:顯示新生代GC狀況
  • -gcnewcapacity:顯示內容與-gcnew基本相同,輸出主要關注使用到的最大、最小空間
  • -gcold:顯示老年代GC狀況
  • -gcoldcapacity:顯示內容與-gcold基本相同,輸出主要關注使用到的最大、最小空間
  • -gcpermcapacity:顯示永久代使用到的最大、最小空間。

JIT相關的:

  • -compiler:顯示JIT編譯器編譯過的方法、耗時等信息
  • -printcompilation:輸出已經被JIT編譯的方法

jstat -class

20210504202501.png

jstat -compiler

20210504202507.png

jstat -printcompilation

20210504202510.png

jstat -gc

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

jstat -gccapacity

20210504202522.png

jstat -gcutil

20210504202524.png

jstat -gccause

20210504202527.png

jstat -gcnew

20210504202530.png

jstat -gcnewcapacity

20210504202532.png

jstat -gcold

20210504202534.png

jstat -gcoldcapacity

20210504202537.png

jstat -t

20210504202539.png

jstat -t -h

20210504202541.png

表頭含義(字節)
ECEden區的大小
EUEden區已使用的大小
S0C幸存者0區的大小
S1C幸存者1區的大小
S0U幸存者0區已使用的大小
S1U幸存者1區已使用的大小
MC元空間的大小
MU元空間已使用的大小
OC老年代的大小
OU老年代已使用的大小
CCSC壓縮類空間的大小
CCSU壓縮類空間已使用的大小
YGC從應用程序啟動到采樣時young gc的次數
YGCT從應用程序啟動到采樣時young gc消耗時間(秒)
FGC從應用程序啟動到采樣時full gc的次數
FGCT從應用程序啟動到采樣時的full gc的消耗時間(秒)
GCT從應用程序啟動到采樣時gc的總時間

interval參數: 用于指定輸出統計數據的周期,單位為毫秒。即:查詢間隔

count參數: 用于指定查詢的總次數

-t參數: 可以在輸出信息前加上一個Timestamp列,顯示程序的運行時間。單位:秒

-h參數: 可以在周期性數據輸出時,輸出多少行數據后輸出一個表頭信息

補充: jstat還可以用來判斷是否出現內存泄漏。

第1步:在長時間運行的 Java 程序中,我們可以運行jstat命令連續獲取多行性能數據,并取這幾行數據中 OU 列(即已占用的老年代內存)的最小值。

第2步:然后,我們每隔一段較長的時間重復一次上述操作,來獲得多組 OU 最小值。如果這些值呈上漲趨勢,則說明該 Java 程序的老年代內存已使用量在不斷上漲,這意味著無法回收的對象在不斷增加,因此很有可能存在內存泄漏。

18.4. jinfo:實時查看和修改JVM配置參數

jinfo(Configuration Info for Java):查看虛擬機配置參數信息,也可用于調整虛擬機的配置參數。在很多情況卡,Java應用程序不會指定所有的Java虛擬機參數。而此時,開發人員可能不知道某一個具體的Java虛擬機參數的默認值。在這種情況下,可能需要通過查找文檔獲取某個參數的默認值。這個查找過程可能是非常艱難的。但有了jinfo工具,開發人員可以很方便地找到Java虛擬機參數的當前值。

基本使用語法為:jinfo [options] pid

說明:java 進程ID必須要加上

選項選項說明
no option輸出全部的參數和系統屬性
-flag name輸出對應名稱的參數
-flag [±]name開啟或者關閉對應名稱的參數 只有被標記為manageable的參數才可以被動態修改
-flag name=value設定對應名稱的參數
-flags輸出全部的參數
-sysprops輸出系統屬性

jinfo -sysprops

> jinfo -sysprops
jboss.modules.system.pkgs = com.intellij.rt
java.vendor = Oracle Corporation
sun.java.launcher = SUN_STANDARD
sun.management.compiler = HotSpot 64-Bit Tiered Compilers
catalina.useNaming = true
os.name = Windows 10
...

jinfo -flags

> jinfo -flags 25592
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=333447168 -XX:MaxHeapSize=5324668928 -XX:MaxNewSize=1774714880 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=111149056 -XX:OldSize=222298112 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line:  -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:8040,suspend=y,server=n -Drebel.base=C:\Users\Vector\.jrebel -Drebel.env.ide.plugin.version=2021.1.2 -Drebel.env.ide.version=2020.3.3 -Drebel.env.ide.product=IU -Drebel.env.ide=intellij -Drebel.notification.url=http://localhost:7976 -agentpath:C:\Users\Vector\AppData\Roaming\JetBrains\IntelliJIdea2020.3\plugins\jr-ide-idea\lib\jrebel6\lib\jrebel64.dll -Dmaven.home=D:\eclipse\env\maven -Didea.modules.paths.file=C:\Users\Vector\AppData\Local\JetBrains\IntelliJIdea2020.3\Maven\idea-projects-state-596682c7.properties -Dclassworlds.conf=C:\Users\Vector\AppData\Local\Temp\idea-6755-mvn.conf -Dmaven.ext.class.path=D:\IDEA\plugins\maven\lib\maven-event-listener.jar -javaagent:D:\IDEA\plugins\java\lib\rt\debugger-agent.jar -Dfile.encoding=UTF-8

jinfo -flag

> jinfo -flag UseParallelGC 25592
-XX:+UseParallelGC> jinfo -flag UseG1GC 25592
-XX:-UseG1GC

jinfo -flag name

> jinfo -flag UseParallelGC 25592
-XX:+UseParallelGC> jinfo -flag UseG1GC 25592
-XX:-UseG1GC

jinfo -flag [±]name

> jinfo -flag +PrintGCDetails 25592
> jinfo -flag PrintGCDetails 25592
-XX:+PrintGCDetails> jinfo -flag -PrintGCDetails 25592
> jinfo -flag PrintGCDetails 25592
-XX:-PrintGCDetails

拓展:

  • java -XX:+PrintFlagsInitial 查看所有JVM參數啟動的初始值
[Global flags]intx ActiveProcessorCount                      = -1                                  {product}uintx AdaptiveSizeDecrementScaleFactor          = 4                                   {product}uintx AdaptiveSizeMajorGCDecayTimeScale         = 10                                  {product}uintx AdaptiveSizePausePolicy                   = 0                                   {product}
...
  • java -XX:+PrintFlagsFinal 查看所有JVM參數的最終值
[Global flags]intx ActiveProcessorCount                      = -1                                  {product}
...intx CICompilerCount                          := 4                                   {product}uintx InitialHeapSize                          := 333447168                           {product}uintx MaxHeapSize                              := 1029701632                          {product}uintx MaxNewSize                               := 1774714880                          {product}
  • java -XX:+PrintCommandLineFlags 查看哪些已經被用戶或者JVM設置過的詳細的XX參數的名稱和值
-XX:InitialHeapSize=332790016 -XX:MaxHeapSize=5324640256 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC

18.5. jmap:導出內存映像文件&內存使用情況

jmap(JVM Memory Map):作用一方面是獲取dump文件(堆轉儲快照文件,二進制文件),它還可以獲取目標Java進程的內存相關信息,包括Java堆各區域的使用情況、堆中對象的統計信息、類加載信息等。開發人員可以在控制臺中輸入命令“jmap -help”查閱jmap工具的具體使用方式和一些標準選項配置。

官方幫助文檔:https://docs.oracle.com/en/java/javase/11/tools/jmap.html

基本使用語法為:

  • jmap [option]
  • jmap [option] <executable
  • jmap [option] [server_id@]
選項作用
-dump生成dump文件(Java堆轉儲快照),-dump:live只保存堆中的存活對象
-heap輸出整個堆空間的詳細信息,包括GC的使用、堆配置信息,以及內存的使用信息等
-histo輸出堆空間中對象的統計信息,包括類、實例數量和合計容量,-histo:live只統計堆中的存活對象
-J 傳遞參數給jmap啟動的jvm
-finalizerinfo顯示在F-Queue中等待Finalizer線程執行finalize方法的對象,僅linux/solaris平臺有效
-permstat以ClassLoader為統計口徑輸出永久代的內存狀態信息,僅linux/solaris平臺有效
-F當虛擬機進程對-dump選項沒有任何響應時,強制執行生成dump文件,僅linux/solaris平臺有效

說明:這些參數和linux下輸入顯示的命令多少會有不同,包括也受jdk版本的影響。

> jmap -dump:format=b,file=<filename.hprof> <pid>
> jmap -dump:live,format=b,file=<filename.hprof> <pid>

由于jmap將訪問堆中的所有對象,為了保證在此過程中不被應用線程干擾,jmap需要借助安全點機制,讓所有線程停留在不改變堆中數據的狀態。也就是說,由jmap導出的堆快照必定是安全點位置的。這可能導致基于該堆快照的分析結果存在偏差。

舉個例子,假設在編譯生成的機器碼中,某些對象的生命周期在兩個安全點之間,那么:live選項將無法探知到這些對象。

另外,如果某個線程長時間無法跑到安全點,jmap將一直等下去。與前面講的jstat則不同,垃圾回收器會主動將jstat所需要的摘要數據保存至固定位置之中,而jstat只需直接讀取即可。

18.6.自動生成 Heap Dump 文件

  1. -XX:+HeapDumpOnOutOfMemoryError
    當OutOfMemoryError發生時自動生成 Heap Dump 文件。
    當你需要分析Java內存使用情況時,往往是在OOM(OutOfMemoryError)發生時。
  2. -XX:+HeapDumpBeforeFullGC
    當 JVM 執行 FullGC 前執行 dump。
  3. -XX:+HeapDumpAfterFullGC
    當 JVM 執行 FullGC 后執行 dump。
  4. -XX:+HeapDumpOnCtrlBreak
    交互式獲取dump。在控制臺按下快捷鍵Ctrl + Break時,JVM就會轉存一下堆快照。
  5. -XX:HeapDumpPath=/opt/logs/dumplogs
    指定 dump 文件的存儲路徑

18.7. jhat:JDK自帶堆分析工具

jhat(JVM Heap Analysis Tool):Sun JDK提供的jhat命令與jmap命令搭配使用,用于分析jmap生成的heap dump文件(堆轉儲快照)。jhat內置了一個微型的HTTP/HTML服務器,生成dump文件的分析結果后,用戶可以在瀏覽器中查看分析結果(分析虛擬機轉儲快照信息)。

使用了jhat命令,就啟動了一個http服務,端口是7000,即http://localhost:7000/,就可以在瀏覽器里分析。

說明:jhat命令在JDK9、JDK10中已經被刪除,官方建議用VisualVM代替。

基本適用語法:jhat

option參數作用
-stack false|true關閉|打開對象分配調用棧跟蹤
-refs false|true關閉|打開對象引用跟蹤
-port port-number設置jhat HTTP Server的端口號,默認7000
-exclude exclude-file執行對象查詢時需要排除的數據成員
-baseline exclude-file指定一個基準堆轉儲
-debug int設置debug級別
-version啟動后顯示版本信息就退出
-J 傳入啟動參數,比如-J-Xmx512m

18.8. jstack:打印JVM中線程快照

jstack(JVM Stack Trace):用于生成虛擬機指定進程當前時刻的線程快照(虛擬機堆棧跟蹤)。線程快照就是當前虛擬機內指定進程的每一條線程正在執行的方法堆棧的集合。

生成線程快照的作用:可用于定位線程出現長時間停頓的原因,如線程間死鎖、死循環、請求外部資源導致的長時間等待等問題。這些都是導致線程長時間停頓的常見原因。當線程出現停頓時,就可以用jstack顯示各個線程調用的堆棧情況。

官方幫助文檔:https://docs.oracle.com/en/java/javase/11/tools/jstack.html

在thread dump中,要留意下面幾種狀態

  • 死鎖,Deadlock(重點關注)
  • 等待資源,Waiting on condition(重點關注)
  • 等待獲取監視器,Waiting on monitor entry(重點關注)
  • 阻塞,Blocked(重點關注)
  • 執行中,Runnable
  • 暫停,Suspended
  • 對象等待中,Object.wait() 或 TIMED_WAITING
  • 停止,Parked
option參數作用
-F當正常輸出的請求不被響應時,強制輸出線程堆棧
-l除堆棧外,顯示關于鎖的附加信息
-m如果調用本地方法的話,可以顯示C/C++的堆棧

18.9. jcmd:多功能命令行

在JDK 1.7以后,新增了一個命令行工具jcmd。它是一個多功能的工具,可以用來實現前面除了jstat之外所有命令的功能。比如:用它來導出堆、內存使用、查看Java進程、導出線程信息、執行GC、JVM運行時間等。

官方幫助文檔:https://docs.oracle.com/en/java/javase/11/tools/jcmd.html

jcmd擁有jmap的大部分功能,并且在Oracle的官方網站上也推薦使用jcmd命令代jmap命令

**jcmd -l:**列出所有的JVM進程

**jcmd 進程號 help:**針對指定的進程,列出支持的所有具體命令

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

**jcmd 進程號 具體命令:**顯示指定進程的指令命令的數據

  • Thread.print 可以替換 jstack指令
  • GC.class_histogram 可以替換 jmap中的-histo操作
  • GC.heap_dump 可以替換 jmap中的-dump操作
  • GC.run 可以查看GC的執行情況
  • VM.uptime 可以查看程序的總執行時間,可以替換jstat指令中的-t操作
  • VM.system_properties 可以替換 jinfo -sysprops 進程id
  • VM.flags 可以獲取JVM的配置參數信息

18.10. jstatd:遠程主機信息收集

之前的指令只涉及到監控本機的Java應用程序,而在這些工具中,一些監控工具也支持對遠程計算機的監控(如jps、jstat)。為了啟用遠程監控,則需要配合使用jstatd 工具。命令jstatd是一個RMI服務端程序,它的作用相當于代理服務器,建立本地計算機與遠程監控工具的通信。jstatd服務器將本機的Java應用程序信息傳遞到遠程計算機。

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

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

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

相關文章

Jenkins 版本升級與插件問題深度復盤:從 2.443 到 2.504.3 及功能恢復全解析

前言&#xff1a;問題溯源與升級必要性 在 Jenkins 持續集成體系中&#xff0c;插件生態是其強大功能的核心驅動力。然而&#xff0c;某次例行維護中&#xff0c;團隊對 Jenkins 2.443 環境的插件進行批量升級后&#xff0c;意外觸發連鎖反應 &#xff1a; SSH Server 插件功能…

Ribbon實戰

一、前置知識 1.1 負載均衡定義 負載均衡指的是將網絡請求通過不同的算法分配到不同的服務器上的技術&#xff0c;從而提升系統的性能。 1.2 負載均衡工具 負載均衡工具可以分分為客戶端負載均衡工具和服務端負載均衡工具&#xff0c;它們的區別如下。 表1-1 負載均衡工具…

cs285學習筆記(一):課程總覽

根據 Fall 2023 學期的官方課程日程&#xff0c;這里是 CS?285 全課程的 Lecture 大綱及內容摘要&#xff0c;詳細對應周次和主題&#xff0c;方便你快速定位每節課要點、相關作業與視頻資源 &#x1f3af; 官方課程地址 YouTobe 視頻地址 blibli視頻(帶中文字幕) &#x…

OkHttp SSE 完整總結(最終版)

1. SSE 基礎概念 什么是 SSE&#xff1f; SSE&#xff08;Server-Sent Events&#xff09;是一種 Web 標準&#xff0c;允許服務器向客戶端推送實時數據。 核心特點 單向通信&#xff1a;服務器 → 客戶端 基于 HTTP 協議&#xff1a;使用 GET 請求 長連接&#xff1a;連…

聚寬sql數據庫傳遞

自建數據庫從聚寬到Q-MT自動化交易實戰 從接觸聚寬以來一直都是手動跟單&#xff0c;在網上看到許多大佬的自動交易文章&#xff0c;心里也不禁十分癢癢。百說不如一練&#xff0c;千講不如實干。經過一番努力&#xff0c;終于成功實盤了&#xff0c;效果還可以&#xff0c;幾…

es里為什么node和shard不是一對一的關系

提問&#xff1a; 既然多個shard會被分配到同一個node上&#xff0c;那么為什么不把多個shard合并成一個然后存在當前node上呢&#xff0c;簡而言之也就是讓node和shard形成一對一的關系呢 &#xff1f;非常好的問題&#xff0c;這正是理解Elasticsearch分片&#xff08;shard…

淺談npm,cnpm,pnpm,npx,nvm,yarn之間的區別

首先做一個基本的分類 名稱描述npm,cnpm,yarn,pnpm都是Javascript包管理器nvm是Node.js版本控制器npx命令行工具 I.npm,cnpm,yarn,pnpm npm (Node Package Manager) npm是Node.js默認的包管理器&#xff0c;隨Node.js的安裝會一起安裝。使用npm可以安裝&#xff0c;發布&…

滑動窗口-76.最小覆蓋子串-力扣(LeetCode)

一、題目解析1.不符合要求則返回空串("")2.子串中重復字符的數量要不少于t中該字符的數量二、算法原理解法1&#xff1a;暴力枚舉哈希表這里的暴力枚舉也可以優化&#xff0c;即在包含t中元素處枚舉&#xff0c;如在A、B和C處開始枚舉&#xff0c;減少不必要的枚舉 解…

從零構建搜索引擎 build demo search engine from scratch

從零構建搜索引擎 build demo search engine from scratch 我們每天都會使用搜索引擎&#xff1a;打開google等搜索引擎&#xff0c;輸入關鍵詞&#xff0c;檢索出結果&#xff0c;這是一次搜索&#xff1b;當打開歷史記錄旁邊的&#x1f50d;按鈕&#xff0c;輸入關鍵詞&#…

pytorch小記(二十九):深入解析 PyTorch 中的 `torch.clip`(及其別名 `torch.clamp`)

pytorch小記&#xff08;二十九&#xff09;&#xff1a;深入解析 PyTorch 中的 torch.clip&#xff08;及其別名 torch.clamp&#xff09;深入解析 PyTorch 中的 torch.clip&#xff08;及其別名 torch.clamp&#xff09;一、函數簽名二、簡單示例三、廣播支持四、與 Autograd…

快速分頁wpf

/*沒有在xaml設置上下文window.context是因為 命名空間一直對應不上 所以在xaml.cs 里面綁定*/ <Window x:Class"DataGrid.views.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft…

如何徹底禁用 Chrome 自動更新

如何徹底禁用 Chrome 自動更新 隨著谷歌將 Chrome 瀏覽器版本升級至 138&#xff0c;它即將徹底拋棄對 Manifest V2 擴展的支持。許多用戶希望將瀏覽器版本鎖定在 138&#xff0c;以繼續使用 uBlock Origin、Tampermonkey 等常用擴展。 本文總結了四種有效方法&#xff0c;幫助…

流批一體的“奧卡姆剃刀”:Apache Cloudberry 增量物化視圖應用解析

引言&#xff1a;流批一體&#xff0c;理想與現實的鴻溝 在數據驅動的今天&#xff0c;“實時”二字仿佛擁有魔力&#xff0c;驅使著無數企業投身于流批一體架構的建設浪潮中。我們渴望實時洞察業務變化&#xff0c;實時響應用戶需求。以 Apache Flink 為代表的流處理引擎&…

C# 入門教程(三):詳解字段、屬性、索引器及各類參數與擴展方法

文章目錄一、字段、屬性、索引器、常量1.字段2.屬性2.1 什么是屬性2.2 屬性的聲明2.3 屬性與字段的關系3 索引器4. 常量二、傳值 輸出 引用 數組 具名 可選參數&#xff0c;擴展方法2.1 傳值參數2.1.1 值類型 傳參2.1.2 引用類型 傳參2.2 引用參數2.2.1 引用參數-值類型 傳參2.…

《美術教育研究》是什么級別的期刊?是正規期刊嗎?能評職稱嗎?

?問題解答&#xff1a;問&#xff1a;《美術教育研究》是不是核心期刊&#xff1f;答&#xff1a;不是&#xff0c;是知網收錄的第一批認定學術期刊。問&#xff1a;《美術教育研究》級別&#xff1f;答&#xff1a;省級。主管單位&#xff1a; 安徽出版集團有限責任公司 主辦…

每日算法刷題Day47:7.13:leetcode 復習完滑動窗口一章,用時2h30min

思考: 遇到子數組/子字符串可以考慮能不能用滑動窗口&#xff0c; 定長:逆向思維,答案不定 最大長度/最小長度:一般求長度 越長越合法/越短越合法/恰好:一般求數量 主要思考窗口條件成立&#xff0c; 判斷條件是符合窗口條件(最小長度/越長越合法還是不符合(最大長度/越短越合法…

電流驅動和電壓驅動的區別

理解電流驅動和電壓驅動的區別對電路設計至關重要&#xff0c;尤其在高速、高抗噪要求的場景&#xff08;如LVDS&#xff09;。以下是兩者的核心對比&#xff1a;一、電壓驅動 (Voltage Drive) 核心原理&#xff1a; 驅動器輸出一個受控的電壓&#xff08;與負載阻抗無關&#…

宿舍電費查詢——以ZUA為例

宿舍電費查詢——以ZUA為例0. 安裝抓包環境手機端桌面端1. 登錄1.1 開啟抓包后進入繳費頁面&#xff1a;1.2 分析請求1.3 編寫登錄代碼2. 獲取樓棟及房間ID2.1 獲取樓棟ID2.2 編寫獲取樓棟ID代碼2.3 獲取房間ID2.4 編寫獲取房間ID代碼3. 獲取剩余電費&#xff1a;3.1 選擇房間號…

vue中計算屬性的介紹

Vue.js 中的計算屬性是基于它的響應式系統來實現的&#xff0c;它可以根據 Vue 實例的數據狀態來動態計算出新的屬性值。在 Vue 組件中&#xff0c;計算屬性常用于對數據進行處理和轉換&#xff0c;以及動態生成一些需要的數據。一、使用方式1.定義計算屬性&#xff1a; 在Vue組…

MFC UI控件CheckBox從專家到小白

文章目錄CheckBox勾選框控件控件與變量綁定控件點擊消息映射互斥CheckBox勾選框控件 控件與變量綁定 方案一&#xff1a; BOOL m_bEnable1; BOOL m_bEnable2; void A::DoDataExchange(CDataExchange* pDX) {DDX_Check(pDX, IDC_CK_1, m_bEnable1);DDX_Check(pDX, IDC_CK_2, …