Java 診斷工具 Arthas 常見命令

基本概念

云原生這么多微服務,當然需要一個診斷利器來排查問題。

Arthas 是阿里開源的 Java 診斷工具,深受開發者喜愛。在線排查問題,無需重啟;動態跟蹤 Java 代碼;實時監控 JVM 狀態。Arthas 支持 JDK 6+,支持 Linux/Mac/Windows,采用命令行交互模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。

官方定義為Java應用診斷利器,截至目前github收獲30.2K個star。

可以用來查看線程,內存,GC和運行時狀態,查看入參/返回值/異常,快速定位應用的熱點,生成火焰圖等功能,幫助更快排查疑難問題。本文主要講述常見命令的使用。

常見命令

啟動arthas-demo(案例程序)

執行如下命令下載?arthas-demo.jar,再用java -jar命令啟動案例程序:

wget?https://arthas.aliyun.com/arthas-demo.jar;
java?-jar?arthas-demo.jar

啟動arthas-boot(診斷工具程序)

執行如下命令下載arthas-boot.jar,再用java -jar命令啟動:

wget?https://arthas.aliyun.com/arthas-boot.jar;
java?-jar?arthas-boot.jar

arthas-boot是Arthas的啟動程序,它啟動后,會列出所有的Java進程,用戶可以選擇需要診斷的目標進程。

選擇要診斷的Java程序,我這里輸入 1 ,再按回車鍵(Enter)。

Attach成功之后,會打印Arthas LOGO。

輸入 help 可以獲取到Arthas相關命令幫助信息。

[arthas@1266]$?helpNAME?????????DESCRIPTION?????????????????????????????????????????????????????????????????????????????help?????????Display?Arthas?Help?????????????????????????????????????????????????????????????????????auth?????????Authenticates?the?current?session???????????????????????????????????????????????????????keymap???????Display?all?the?available?keymap?for?the?specified?connection.??????????????????????????sc???????????Search?all?the?classes?loaded?by?JVM????????????????????????????????????????????????????sm???????????Search?the?method?of?classes?loaded?by?JVM??????????????????????????????????????????????classloader??Show?classloader?info???????????????????????????????????????????????????????????????????jad??????????Decompile?class?????????????????????????????????????????????????????????????????????????getstatic????Show?the?static?field?of?a?class????????????????????????????????????????????????????????monitor??????Monitor?method?execution?statistics,?e.g.?total/success/failure?count,?average?rt,?fail?rate,?etc.?????????????????????????????????????????????????????????????????????????????stack????????Display?the?stack?trace?for?the?specified?class?and?method??????????????????????????????thread???????Display?thread?info,?thread?stack???????????????????????????????????????????????????????trace????????Trace?the?execution?time?of?specified?method?invocation.????????????????????????????????watch????????Display?the?input/output?parameter,?return?object,?and?thrown?exception?of?specified?me?thod?invocation?????????????????????????????????????????????????????????????????????????tt???????????Time?Tunnel?????????????????????????????????????????????????????????????????????????????jvm??????????Display?the?target?JVM?information??????????????????????????????????????????????????????memory???????Display?jvm?memory?info.????????????????????????????????????????????????????????????????perfcounter??Display?the?perf?counter?information.???????????????????????????????????????????????????ognl?????????Execute?ognl?expression.????????????????????????????????????????????????????????????????mc???????????Memory?compiler,?compiles?java?files?into?bytecode?and?class?files?in?memory.???????????redefine?????Redefine?classes.?@see?Instrumentation#redefineClasses(ClassDefinition...)??????????????retransform??Retransform?classes.?@see?Instrumentation#retransformClasses(Class...)??????????????????dashboard????Overview?of?target?jvm's?thread,?memory,?gc,?vm,?tomcat?info.???????????????????????????dump?????????Dump?class?byte?array?from?JVM??????????????????????????????????????????????????????????heapdump?????Heap?dump???????????????????????????????????????????????????????????????????????????????options??????View?and?change?various?Arthas?options??????????????????????????????????????????????????cls??????????Clear?the?screen????????????????????????????????????????????????????????????????????????reset????????Reset?all?the?enhanced?classes??????????????????????????????????????????????????????????version??????Display?Arthas?version??????????????????????????????????????????????????????????????????session??????Display?current?session?information?????????????????????????????????????????????????????sysprop??????Display,?and?change?the?system?properties.??????????????????????????????????????????????sysenv???????Display?the?system?env.?????????????????????????????????????????????????????????????????vmoption?????Display,?and?update?the?vm?diagnostic?options.??????????????????????????????????????????logger???????Print?logger?info,?and?update?the?logger?level??????????????????????????????????????????history??????Display?command?history?????????????????????????????????????????????????????????????????cat??????????Concatenate?and?print?files?????????????????????????????????????????????????????????????base64???????Encode?and?decode?using?Base64?representation???????????????????????????????????????????echo?????????write?arguments?to?the?standard?output??????????????????????????????????????????????????pwd??????????Return?working?directory?name???????????????????????????????????????????????????????????mbean????????Display?the?mbean?information???????????????????????????????????????????????????????????grep?????????grep?command?for?pipes.?????????????????????????????????????????????????????????????????tee??????????tee?command?for?pipes.??????????????????????????????????????????????????????????????????profiler?????Async?Profiler.?https://github.com/jvm-profiling-tools/async-profiler???????????????????vmtool???????jvm?tool????????????????????????????????????????????????????????????????????????????????stop?????????Stop/Shutdown?Arthas?server?and?exit?the?console.???

與linux同樣規則的命令此處不再贅述。如:history,cat,echo,pwd,grep。

系統的實時數據面板 dashboard 命令

dashboard 命令可以查看當前系統的實時數據面板。可以查看到CPU、內存、GC、運行環境等信息。

輸入 q 或者 Ctrl+C 可以退出dashboard命令。

打印線程ID 的棧 thread

thread 1 命令會打印線程ID 1的棧。用 thread 1 | grep 'main(' 查找到main class。

查找JVM里已加載的類 sc/sm

可以通過 sc 命令來查找JVM里已加載的類,通過-d參數,可以打印出類加載的具體信息,很方便查找類加載問題。

[arthas@1266]$?sc?-d?*MathGameclass-info????????demo.MathGame?????????????????????????????????????????????????????????????????????????????????????????????code-source???????/home/shell/arthas-demo.jar???????????????????????????????????????????????????????????????????????????????name??????????????demo.MathGame?????????????????????????????????????????????????????????????????????????????????????????????isInterface???????false?????????????????????????????????????????????????????????????????????????????????????????????????????isAnnotation??????false?????????????????????????????????????????????????????????????????????????????????????????????????????isEnum????????????false?????????????????????????????????????????????????????????????????????????????????????????????????????isAnonymousClass??false?????????????????????????????????????????????????????????????????????????????????????????????????????isArray???????????false?????????????????????????????????????????????????????????????????????????????????????????????????????isLocalClass??????false?????????????????????????????????????????????????????????????????????????????????????????????????????isMemberClass?????false?????????????????????????????????????????????????????????????????????????????????????????????????????isPrimitive???????false?????????????????????????????????????????????????????????????????????????????????????????????????????isSynthetic???????false?????????????????????????????????????????????????????????????????????????????????????????????????????simple-name???????MathGame??????????????????????????????????????????????????????????????????????????????????????????????????modifier??????????public????????????????????????????????????????????????????????????????????????????????????????????????????annotation??????????????????????????????????????????????????????????????????????????????????????????????????????????????????interfaces??????????????????????????????????????????????????????????????????????????????????????????????????????????????????super-class???????+-java.lang.Object????????????????????????????????????????????????????????????????????????????????????????class-loader??????+-sun.misc.Launcher$AppClassLoader@1b6d3586???????????????????????????????????????????????????????????????+-sun.misc.Launcher$ExtClassLoader@107df6e5?????????????????????????????????????????????????????????????classLoaderHash???1b6d3586??????????????????????????????????????????????????????????????????????????????????????????????????Affect(row-cnt:1)?cost?in?50?ms.

sc支持通配,比如搜索所有的StringUtils:

sc?*StringUtils

查找UserController的ClassLoader

[arthas@1266]$?sc?-d?com.example.demo.arthas.user.UserController?|?grep?classLoaderHashclassLoaderHash???19469ea2

sm命令則是查找類的具體函數。比如:

sm?java.math.RoundingMode

通過-d參數可以打印函數的具體屬性:

sm?-d?java.math.RoundingMode

查找特定的函數,比如查找構造函數:

sm?java.math.RoundingMode?<init>

反編譯代碼 jad命令

jad demo.MathGame

通過--source-only參數可以只打印出在反編譯的源代碼:

jad?--source-only?com.example.demo.arthas.user.UserController

動態執行代碼 ognl 命令

在Arthas里,有一個單獨的ognl命令,可以動態執行代碼。這個有點秀啊😯😯😯

調用static函數

ognl?'@java.lang.System@out.println("hello?ognl")'

獲取靜態類的靜態字段

獲取UserController類里的logger字段:

ognl?--classLoaderClass?org.springframework.boot.loader.LaunchedURLClassLoader?@com.example.demo.arthas.user.UserController@logger

通過-x參數控制返回值的展開層數。比如:

ognl?--classLoaderClass?org.springframework.boot.loader.LaunchedURLClassLoader?-x?2?@com.example.demo.arthas.user.UserController@logger

執行多行表達式,賦值給臨時變量,返回一個List

ognl?'#value1=@System@getProperty("java.home"),?#value2=@System@getProperty("java.runtime.name"),?{#value1,?#value2}'
  • OGNL特殊用法請參考:https://github.com/alibaba/arthas/issues/71

  • OGNL表達式官方指南:https://commons.apache.org/proper/commons-ognl/language-guide.html

查看函數的參數/返回值/異常信息 watch 命令

watch?demo.MathGame?primeFactors?returnObj

查看JVM信息 sysprop sysenv jvm dashboard

sysprop

  • sysprop :打印所有的System Properties信息。

  • 指定單個key:sysprop user.dir

  • 通過grep過濾 :sysprop | grep user

  • 設置新的value:sysprop testKey testValue

sysenv

sysenv 命令可以獲取到環境變量。和sysprop命令類似。

jvm

jvm 命令會打印出JVM的各種詳細信息。

dashboard

dashboard 命令可以查看當前系統的實時數據面板。

重置增強類 reset 命令

通過reset命令可以重置增強類,將被 Arthas 增強過的類全部還原,Arthas 服務端關閉時會重置所有增強過的類。Arthas在?watch/trace?等命令時,實際上是修改了應用的字節碼,插入增強的代碼。顯式執行 reset 命令,可以清除掉這些增強代碼。

reset 還原指定類:

reset?demo.MathGame

還原所有增強類:

reset

查看當前會話信息 session

tee 命令

類似傳統的tee命令 用于讀取標準輸入的數據,并將其內容輸出成文件。

tee指令會從標準輸入設備讀取數據,將其內容輸出到標準輸出設備,同時保存成文件。

查看當前Arthas版本 version

[arthas@1710]$?version
3.6.2

退出Arthas

輸入 exit 或者 quit 命令可以退出Arthas當前session。執行 stop 命令徹底退出Arthas。

📌PS:所有命令都可以通過 -h 參數查看幫助信息。

實操案例

排查函數調用異常

通過curl 請求接口只能看到返回異常,但是看不到具體的請求參數和堆棧信息。

shell@Alicloud:~$?curl?http://localhost:61000/user/0
{"timestamp":1655435063042,"status":500,"error":"Internal?Server?Error","exception":"java.lang.IllegalArgumentException","message":"id?<?1","path":"/user/0"}

查看UserController的 參數/異常

在Arthas里執行:

watch?com.example.demo.arthas.user.UserController?*?'{params,?throwExp}'
  • 第一個參數是類名,支持通配

  • 第二個參數是函數名,支持通配 訪問?curl http://localhost:61000/user/0,watch命令會打印調用的參數和異常

再次通過curl 調用可以在arthas里面查看到具體的異常信息。

把獲取到的結果展開,可以用-x參數:

watch?com.example.demo.arthas.user.UserController?*?'{params,?throwExp}'?-x?2

返回值表達式

在上面的例子里,第三個參數是返回值表達式,它實際上是一個ognl表達式,它支持一些內置對象:

  • loader

  • clazz

  • method

  • target

  • params

  • returnObj

  • throwExp

  • isBefore

  • isThrow

  • isReturn

比如返回一個數組:

watch?com.example.demo.arthas.user.UserController?*?'{params[0],?target,?returnObj}'

條件表達式

watch命令支持在第4個參數里寫條件表達式,比如:

  • 當訪問?user/1?時,watch命令沒有輸出

  • 當訪問?user/101?時,watch會打印出結果。

當異常時捕獲

watch命令支持-e選項,表示只捕獲拋出異常時的請求:

watch?com.example.demo.arthas.user.UserController?*?"{params[0],throwExp}"?-e

按照耗時進行過濾

watch命令支持按請求耗時進行過濾,比如:

watch?com.example.demo.arthas.user.UserController?*?'{params,?returnObj}'?'#cost>200'

熱更新代碼

這個也是真的秀。

訪問?http://localhost:61000/user/0?,會返回500異常:

shell@Alicloud:~$?curl?http://localhost:61000/user/0
{"timestamp":1655436218020,"status":500,"error":"Internal?Server?Error","exception":"java.lang.IllegalArgumentException","message":"id?<?1","path":"/user/0"}

通過熱更新代碼,修改這個邏輯。

jad反編譯UserController

jad?--source-only?com.example.demo.arthas.user.UserController?>?/tmp/UserController.java

jad反編譯的結果保存在?/tmp/UserController.java文件里了。

再打開一個Terminal 窗口,然后用vim來編輯/tmp/UserController.java

vim?/tmp/UserController.java

比如當?user id?小于1時,也正常返回,不拋出異常:

@GetMapping(value={"/user/{id}"})
public?User?findUserById(@PathVariable?Integer?id)?{logger.info("id:?{}",?(Object)id);if?(id?!=?null?&&?id?<?1)?{return?new?User(id,?"name"?+?id);//?throw?new?IllegalArgumentException("id?<?1");}return?new?User(id.intValue(),?"name"?+?id);
}

sc查找加載UserController的ClassLoader

[arthas@1266]$?sc?-d?*UserController?|?grep?classLoaderHashclassLoaderHash???19469ea2

classLoaderHash 是19469ea2,后面需要使用它。

mc

保存好/tmp/UserController.java之后,使用mc(Memory Compiler)命令來編譯,并且通過-c或者–classLoaderClass參數指定ClassLoader

mc?--classLoaderClass?org.springframework.boot.loader.LaunchedURLClassLoader?/tmp/UserController.java?-d?/tmp
[arthas@1266]$?mc?--classLoaderClass?org.springframework.boot.loader.LaunchedURLClassLoader?/tmp/UserController.java?-d?/tmp
Memory?compiler?output:
/tmp/com/example/demo/arthas/user/UserController.class
Affect(row-cnt:1)?cost?in?2879?ms.

也可以通過mc -c /tmp/UserController.java -d /tmp,使用-c參數指定ClassLoaderHash:

mc?-c?19469ea2?/tmp/UserController.java?-d?/tmp

redefine

再使用redefine命令重新加載新編譯好的UserController.class

[arthas@1266]$?redefine?/tmp/com/example/demo/arthas/user/UserController.class
redefine?success,?size:?1,?classes:
com.example.demo.arthas.user.UserController

熱修改代碼結果

redefine成功之后,再次訪問?user/0?,結果正常

shell@Alicloud:~$?curl?http://localhost:61000/user/0
{"id":0,"name":"name0"}

動態更新應用Logger Level

查找UserController的ClassLoader

[arthas@1266]$?sc?-d?*UserController?|?grep?classLoaderHashclassLoaderHash???19469ea2

用ognl獲取logger

ognl?--classLoaderClass?org.springframework.boot.loader.LaunchedURLClassLoader?‘@com.example.demo.arthas.user.UserController@logger’
[arthas@1266]$?ognl?--classLoaderClass?org.springframework.boot.loader.LaunchedURLClassLoader?'@com.example.demo.arthas.user.UserController@logger'
@Logger[serialVersionUID=@Long[5454405123156820674],FQCN=@String[ch.qos.logback.classic.Logger],name=@String[com.example.demo.arthas.user.UserController],level=null,effectiveLevelInt=@Integer[20000],parent=@Logger[Logger[com.example.demo.arthas.user]],childrenList=null,aai=null,additive=@Boolean[true],loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]],
]

可以知道UserController@logger實際使用的是logback。可以看到level=null,則說明實際最終的level是從root logger里來的。

單獨設置UserController的logger level

ognl?--classLoaderClass?org.springframework.boot.loader.LaunchedURLClassLoader?'@com.example.demo.arthas.user.UserController@logger.setLevel(@ch.qos.logback.classic.Level@DEBUG)'

再次獲取UserController@logger,可以發現已經是DEBUG了。

修改logback的全局logger level

通過獲取root logger,可以修改全局的logger level

ognl?--classLoaderClass?org.springframework.boot.loader.LaunchedURLClassLoader?'@org.slf4j.LoggerFactory@getLogger("root").setLevel(@ch.qos.logback.classic.Level@DEBUG)'

獲取Spring Context,在獲取 bean,再調用函數

使用tt命令獲取到spring context

tt即 TimeTunnel,它可以記錄下指定方法每次調用的入參和返回信息,并能對這些不同的時間下調用進行觀測。

官方tt說明:https://arthas.aliyun.com/doc/tt.html

tt?-t?org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter?invokeHandlerMethod

訪問user/1:

?curl?http://localhost:61000/user/1

可以看到tt命令捕獲到了一個請求:

輸入 q 或者 Ctrl + C 退出上面的 tt -t命令。

使用tt命令從調用記錄里獲取到spring context

tt?-i?1000?-w?'target.getApplicationContext()'

獲取spring bean,并調用函數

tt?-i?1000?-w?‘target.getApplicationContext().getBean(“helloWorldService”).getHelloMessage()’

結果如下:

[arthas@1266]$?tt?-i?1000?-w?'target.getApplicationContext().getBean("helloWorldService").getHelloMessage()'
@String[Hello?World]
Affect(row-cnt:1)?cost?in?1?ms.

排查HTTP請求返回401

請求接口沒有權限的時候一般就返回401 Unauthorized。

401通常是被權限管理的Filter攔截了,那么到底是哪個Filter處理了這個請求,返回了401?

跟蹤所有的Filter函數

開始trace:

trace?javax.servlet.Filter?*

可以在調用樹的最深層,找到AdminFilterConfig$AdminFilter返回了401

+---[3.806273ms]?javax.servlet.FilterChain:doFilter()
|???`---[3.447472ms]?com.example.demo.arthas.AdminFilterConfig$AdminFilter:doFilter()
|???????`---[0.17259ms]?javax.servlet.http.HttpServletResponse:sendError()

通過stack獲取調用棧

上面是通過trace命令來獲取信息,從結果里,我們可以知道通過stack跟蹤HttpServletResponse:sendError(),同樣可以知道是哪個Filter返回了401

執行:

stack?javax.servlet.http.HttpServletResponse?sendError?'params[0]==401'

訪問可以看到如下堆棧信息:

查找Top N線程

查看所有線程信息

thread

查看具體線程的棧

查看線程ID 2的棧:

thread?2

查看CPU使用率top n線程的棧

thread?-n?3

查看5秒內的CPU使用率top n線程棧

thread?-n?3?-i?5000

查找線程是否有阻塞

thread?-b

更多使用查看:

  • Github地址:?https://github.com/alibaba/arthas

  • 文檔地址:?https://arthas.aliyun.com/doc/

轉自:blog.csdn.net/qq_35427589/article/details/125331696

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

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

相關文章

28和lba48命令格式區別_編譯Sass(命令行)

本文作者&#xff1a;開課吧無憂圖文編輯&#xff1a;開三金sass編譯有很多種方式&#xff0c;如命令行編譯模式、編輯器自動編譯、編譯軟件koala、sass-loader等。今天我們就先來看第一種&#xff1a;命令行編譯剛才我在test文件夾里面已經建立了一個style.scss文件&#xff0…

JAVA基礎編程代碼50個

【程序1】 題目&#xff1a;古典問題&#xff1a;有一對兔子&#xff0c;從出生后第3個月起每個月都生一對兔子&#xff0c;小兔子長到第三個月后每個月又生一對兔子&#xff0c;假如兔子都不死&#xff0c;問每個月的兔子對數為多少&#xff1f; 程序分析&#xff1a; 兔子…

爬蟲軟件python功能_Python 網絡爬蟲程序詳解

#!/usr/bin/python #調用pythonfrom sys import argv #導入sys是導入python解釋器和他環境相關的參數from os import makedirs,unlink,sep  #os主要提供對系統路徑&#xff0c;文件重命名和刪除文件所需的函數#makedirs是創建遞歸文件夾的函數。#比如說我們要創建一個新的目錄…

價錢轉換python_如何在python中轉換貨幣?

我正在做一個虛擬助手項目。我想讓它告訴我其他貨幣的美元匯率。我用beauthoulsoup編寫了以下代碼&#xff0c;它從給定的網站獲取數據&#xff0c;對其進行解析并在命令行中打印結果供我閱讀。但這只是美元對巴基斯坦盧比。如何修改程序&#xff0c;使其接受任何貨幣并告訴我該…

char qt 轉unicode_Qt QString 中文 char* UTF-8 QByteArray QTextCodec unicode gb2312 GBK 亂碼與轉碼問題...

2012-03-22 14:00175人閱讀評論(0)代碼如下&#xff1a;如果不不設全局的字符集是utf-8&#xff0c;那么網上一般的方法是可以轉的。如下程序中 #define DD 1的情況下&#xff1b;但是如果設置了全局的utf-8&#xff0c;再用以前的方法&#xff1a;QByteArraybaaaa.toLatin1();…

計算機圖形學考試題及答案_計算機圖形學考試題及答案

3、在圖形文件中&#xff0c;常用來描述圖形元素(點&#xff0c;線&#xff0c;圓&#xff0c;弧等)&#xff1b;而在光柵掃描圖形顯示器中&#xff0c;采用顯示所有圖形。4、當三維物體用透視變換方程投影到觀察平面上&#xff0c;物體中不與觀察平面平行任一簇平行線投影成收…

子窗體中組合框聯動_一張表實現組合框聯動

嗨&#xff0c;大家中午好&#xff01;最近&#xff0c;有網友給我私信&#xff0c;想要一個聯動的示例&#xff0c;一個有關于部門聯動的操作。其實關于聯動的操作有很多&#xff0c;可以是組合框的聯動&#xff0c;列表框聯動&#xff0c;組合框與列表框也可以聯動&#xff0…

中如何實現文字轉語音_錄音轉文字、文字轉語音,學會這一招就夠了!手把手教你如何操作...

閱讀文章時候想著有人可以把文章讀給我聽就好了&#xff0c;寫作時想著語音直接可以轉換成文字就好了&#xff0c;大家是不是有時會突然冒出這樣的想法&#xff1f;七十這些看似天真的想法&#xff0c;還真的有辦法解決&#xff0c;這里就手把手教你如何操作才能將的文字轉換成…

圖像 理想低通濾波_圖像處理之濾波(下)

[toc]目錄一、常規濾波低通高通帶通帶阻二、非局部均值濾波三、維納濾波四、卡爾曼濾波前言所謂濾波&#xff0c;其實就是從混合在一起的諸多信號中提取出所需要的信號。信號的分類&#xff1a;確定型信號&#xff0c;可以表示為確定的時間函數&#xff0c;可確定其在任何時刻的…

泰山行宮碧霞元君祠_臨清市泰山行宮碧霞元君祠5月4號(農歷三月三十日)舉行大型泰山奶奶接駕法會...

臨清是泰山奶奶的娘家&#xff0c;每年的四月泰山奶奶要回臨清省親臨清市道教協會定于2019年農歷三月三十(5月4號星期六)于臨清桑樹園泰山行宮碧霞元君祠舉行大型泰山奶奶迎鸞接駕廟會。屆時&#xff0c;將有架鼓會、云龍會、獅胞會、鋼叉會、高蹺會、天音會、彩船會、秧歌會等…

充分條件反過來是必要條件嗎_“充分必要條件”引發的現實思考

昨天看了一篇文章是介紹“充分條件和必要條件”&#xff0c;大致就是A能直接推導出B&#xff0c;那A就是B的充分條件。A不一定能推導出B&#xff0c;但是沒A一定推導不出B&#xff0c;那A就是B必要條件。舉個簡單的例子&#xff1a;對你好&#xff08;A&#xff09;與喜歡你&am…

手機游戲降低游戲延遲的軟件_怎么降低手機網絡延遲(減少網絡延遲的5個小技巧)...

在過去的幾十年里&#xff0c;用戶或開發人員并不擔心延遲。在上世紀90年代和本世紀初&#xff0c;個人互聯網連接速度要慢得多&#xff0c;因此發送請求和接收響應之間的延遲要遠遠小于下載完成所需的時間。如今&#xff0c;更高的帶寬連接使下載速度更快&#xff0c;因此延遲…

mysql常用的開發軟件下載_強烈推薦!14款經典的MySQL客戶端軟件

【IT168 評論】不用我說&#xff0c;大家都知道MySQL是一個怎么樣的數據庫。雖然它的命運比較坎坷&#xff0c;但是絲毫沒有影響到我們對MySQL的熱情。不論是個人程序或者網站&#xff0c;還是企業數據庫&#xff0c;MySQL的身影無處不在。無論做什么數據庫的開發&#xff0c;一…

mysql最大值最小值_mysql最大值,最小值,總和查詢與計數查詢

1、最大值查詢&#xff1a;mysql> select max(score) from 4a;------------| max(score) |------------| 93 |------------1 row in set (0.06 sec)2、最小值查詢&#xff1a;mysql> select max(4a.score),min(4inall.score) from 4a,4inall;-------------------…

阿里云 centos mysql_在阿里云的CentOS環境中安裝配置MySQL的教程

1 常規錯誤的yum安裝方法&#xff1a;在前文中記述了CentOS 6.5系統中通過yum方式快速地搭建了LNMP環境&#xff0c;那么是否也能在CentOS 7或CentOS 7.1系統中依葫蘆畫瓢安裝MySql5.6.24呢&#xff1f;答案是否定的。[roottypecodes ~]# yum -y install mysql mysql-server my…

mysql文件脫機_SQL數據庫的脫機與聯機操作

online : 可對數據庫進行訪問offline&#xff1a;數據庫無法使用1、使用查詢語句select state_desc from sysdatabases where name 數據庫名 2、使用databasepropertyex( database,property)函數select databasepropertyex( 數據庫 ,’ status )分離數據庫&#xff1a;EXEC…

dockerfile 安裝mysql_dockerfile構建mysql鏡像

使用dockerfile構建mysql&#xff0c;鏡像構建完成后&#xff0c;運行容器后&#xff0c;啟動mysql服務總是報錯Fatal error: Cant open and lock privilege tables: Table storage engine for db doesnt have this optionmysql安裝使用的官方的壓縮包mysql-5.7.20-linux-glibc…

ubunt11 安裝mysql_ubuntu 11.10安裝mysql

1. 安裝devadmdevserver:~$ sudo apt-get install mysql-server......The following NEW packages will be installed:libdbd-mysql-perl libdbi-perl libhtml-template-perl libmysqlclient16libnet-daemon-perl libplrpc-perl mysql-client-5.1 mysql-client-core-5.1mysql-c…

mysql 取交集 php_mysql 查詢結果取交集的方法

本文將詳細介紹MySQL中如何實現以SQL查詢返回的結果集取交集的實現方法&#xff0c;需要的朋友可以參考1MySQL中如何實現以下SQL查詢(SELECT S.NameFROM STUDENT S, TRANSCRIPT TWHERE S.StudId T.StudId AND T.CrsCode CS305)INTERSECT(SELECT S.NameFROM STUDENT S, TRANSC…

mysql極客_極客mysql16

1.MySQL會為每個線程分配一個內存(sort_buffer)用于排序該內存大小為sort_buffer_size1>如果排序的數據量小于sort_buffer_size&#xff0c;排序將會在內存中完成2>如果排序數據量很大&#xff0c;內存中無法存下這么多數據&#xff0c;則會使用磁盤臨時文件來輔助排序&a…