JVM監控命令詳解
想要了解更多,加QQ群72132378
JDK本身提供了很多方便的JVM效能調優監控工具,除了整合式的VisualVM和jConsole外,還有jps、jstack、jmap、jhat、jstat等小巧的工具,本部落格希望能起拋磚引玉之用,讓大家能開始對JVM效能調優的常用工具有所瞭解。
現實企業級Java開發中,有時候我們會碰到下面這些問題:
-
OutOfMemoryError,記憶體不足
-
記憶體洩露
-
執行緒死鎖
-
鎖爭用(Lock Contention)
-
Java程序消耗CPU過高
-
......
這些問題在日常開發中可能被很多人忽視(比如有的人遇到上面的問題只是重啟伺服器或者調大記憶體,而不會深究問題根源),但能夠理解並解決這些問題是Java程式設計師進階的必備要求。本文將對一些常用的JVM效能調優監控工具進行介紹,希望能起拋磚引玉之用。本文參考了網上很多資料,難以一一列舉,在此對這些資料的作者表示感謝!關於JVM效能調優相關的資料,請參考文末。
A、 jps(Java Virtual Machine Process Status Tool)
jps主要用來輸出JVM中執行的程序狀態資訊。語法格式如下:
1 |
jps [options] [hostid] |
如果不指定hostid就預設為當前主機或伺服器。
命令列引數選項說明如下:
1 |
-q 不輸出類名、Jar名和傳入main方法的引數 |
2 |
-m 輸出傳入main方法的引數 |
3 |
-l 輸出main類或Jar的全限名 |
4 |
- v 輸出傳入JVM的引數 |
比如下面:
1 |
[email protected] # jps -m -l |
2 |
2458 org.artifactory.standalone.main.Main /usr/ local /artifactory-2.2.5/etc/jetty.xml |
3 |
29920 com.sun.tools.hat.Main -port 9998 /tmp/dump.dat |
4 |
3149 org.apache.catalina.startup.Bootstrap start |
5 |
30972 sun.tools.jps.Jps -m -l |
6 |
8247 org.apache.catalina.startup.Bootstrap start |
7 |
25687 com.sun.tools.hat.Main -port 9999 dump.dat |
8 |
21711 mrf-center.jar |
B、 jstack
jstack主要用來檢視某個Java程序內的執行緒堆疊資訊。語法格式如下:
1 |
jstack [option] pid |
2 |
jstack [option] executable core |
3 |
jstack [option] [server- id @]remote- hostname -or-ip |
命令列引數選項說明如下:
1 |
-l long listings,會打印出額外的鎖資訊,在發生死鎖時可以用jstack -l pid來觀察鎖持有情況 |
2 |
-m mixed mode,不僅會輸出Java堆疊資訊,還會輸出C/C++堆疊資訊(比如Native方法) |
jstack可以定位到執行緒堆疊,根據堆疊資訊我們可以定位到具體程式碼,所以它在JVM效能調優中使用得非常多。下面我們來一個例項找出某個Java程序中最耗費CPU的Java執行緒並定位堆疊資訊,用到的命令有ps、top、printf、jstack、grep。
第一步先找出Java程序ID,我部署在伺服器上的Java應用名稱為mrf-center:
1 |
[email protected]:/ # ps -ef | grep mrf-center | grep -v grep |
2 |
root 21711 1 1 14:47 pts/3 00:02:10 java -jar mrf-center.jar |
得到程序ID為21711,第二步找出該程序內最耗費CPU的執行緒,可以使用ps -Lfp pid或者ps -mp pid -o THREAD, tid, time或者top -Hp pid,我這裡用第三個,輸出如下:
TIME列就是各個Java執行緒耗費的CPU時間,CPU時間最長的是執行緒ID為21742的執行緒,用
1 |
printf "%x\n" 21742 |
得到21742的十六進位制值為54ee,下面會用到。
OK,下一步終於輪到jstack上場了,它用來輸出程序21711的堆疊資訊,然後根據執行緒ID的十六進位制值grep,如下:
1 |
[email protected]:/ # jstack 21711 | grep 54ee |
2 |
"PollIntervalRetrySchedulerThread" prio=10 tid=0x00007f950043e000 nid=0x54ee in Object.wait() [0x00007f94c6eda000] |
可以看到CPU消耗在PollIntervalRetrySchedulerThread這個類的Object.wait(),我找了下我的程式碼,定位到下面的程式碼:
01 |
// Idle wait |
02 |
getLog().info( "Thread [" + getName() + "] is idle waiting..." ); |
03 |
schedulerThreadState = PollTaskSchedulerThreadState.IdleWaiting; |
04 |
long now = System.currentTimeMillis(); |
05 |
long waitTime = now + getIdleWaitTime(); |
06 |
long timeUntilContinue = waitTime - now; |
07 |
synchronized (sigLock) { |
08 |
try { |
09 |
if (!halted.get()) { |
10 |
sigLock.wait(timeUntilContinue); |
11 |
} |
12 |
} |
13 |
catch (InterruptedException ignore) { |
14 |
} |
15 |
} |
它是輪詢任務的空閒等待程式碼,上面的sigLock.wait(timeUntilContinue)就對應了前面的Object.wait()。
C、 jmap(Memory Map)和jhat(Java Heap Analysis Tool)
jmap用來檢視堆記憶體使用狀況,一般結合jhat使用。
jmap語法格式如下:
1 |
jmap [option] pid |
2 |
jmap [option] executable core |
3 |
jmap [option] [server- id @]remote- hostname -or-ip |
如果執行在64位JVM上,可能需要指定-J-d64命令選項引數。
1 |
jmap -permstat pid |
列印程序的類載入器和類載入器載入的持久代物件資訊,輸出:類載入器名稱、物件是否存活(不可靠)、物件地址、父類載入器、已載入的類大小等資訊,如下圖:
使用jmap -heap pid檢視程序堆記憶體使用情況,包括使用的GC演算法、堆配置引數和各代中堆記憶體使用情況。比如下面的例子:
01 |
[email protected]:/ # jmap -heap 21711 |
02 |
Attaching to process ID 21711, please wait... |
03 |
Debugger attached successfully. |
04 |
Server compiler detected. |
05 |
JVM version is 20.10-b01 |
06 |
07 |
using thread- local object allocation. |
08 |
Parallel GC with 4 thread(s) |
09 |
10 |
Heap Configuration: |
11 |
MinHeapFreeRatio = 40 |
12 |
MaxHeapFreeRatio = 70 |
13 |
MaxHeapSize = 2067791872 (1972.0MB) |
14 |
NewSize = 1310720 (1.25MB) |
15 |
MaxNewSize = 17592186044415 MB |
16 |
OldSize = 5439488 (5.1875MB) |
17 |
NewRatio = 2 |
18 |
SurvivorRatio = 8 |
19 |
PermSize = 21757952 (20.75MB) |
20 |
MaxPermSize = 85983232 (82.0MB) |
21 |
22 |
Heap Usage: |
23 |
PS Young Generation |
24 |
Eden Space: |
25 |
capacity = 6422528 (6.125MB) |
26 |
used = 5445552 (5.1932830810546875MB) |
27 |
free = 976976 (0.9317169189453125MB) |
28 |
84.78829520089286% used |
29 |
From Space: |
30 |
capacity = 131072 (0.125MB) |
31 |
used = 98304 (0.09375MB) |
32 |
free = 32768 (0.03125MB) |
33 |
75.0% used |
34 |
To Space: |
35 |
capacity = 131072 (0.125MB) |
36 |
used = 0 (0.0MB) |
37 |
free = 131072 (0.125MB) |
38 |
0.0% used |
39 |
PS Old Generation |
40 |
capacity = 35258368 (33.625MB) |
41 |
used = 4119544 (3.9287033081054688MB) |
42 |
free = 31138824 (29.69629669189453MB) |
43 |
11.683876009235595% used |
44 |
PS Perm Generation |
45 |
capacity = 52428800 (50.0MB) |
46 |
used = 26075168 (24.867218017578125MB) |
47 |
free = 26353632 (25.132781982421875MB) |
48 |
49.73443603515625% used |
49 |
.... |
使用jmap -histo[:live] pid檢視堆記憶體中的物件數目、大小統計直方圖,如果帶上live則只統計活物件,如下:
01 |
[email protected]:/ # jmap -histo:live 21711 | more |
02 |
03 |
num #instances #bytes class name |
04 |
---------------------------------------------- |
05 |
1: 38445 5597736 <constMethodKlass> |
06 |
2: 38445 5237288 <methodKlass> |
07 |
3: 3500 3749504 <constantPoolKlass> |
08 |
4: 60858 3242600 <symbolKlass> |
09 |
5: 3500 2715264 <instanceKlassKlass> |
10 |
6: 2796 2131424 <constantPoolCacheKlass> |
11 |
7: 5543 1317400 [I |
12 |
8: 13714 1010768 [C |
13 |
9: 4752 1003344 [B |
14 |
10: 1225 639656 <methodDataKlass> |
15 |
11: 14194 454208 java.lang.String |
16 |
12: 3809 396136 java.lang.Class |
17 |
13: 4979 311952 [S |
18 |
14: 5598 287064 [[I |
19 |
15: 3028 266464 java.lang.reflect.Method |
20 |
16: 280 163520 <objArrayKlassKlass> |
21 |
17: 4355 139360 java.util.HashMap$Entry |
22 |
18: 1869 138568 [Ljava.util.HashMap$Entry; |
23 |
19: 2443 97720 java.util.LinkedHashMap$Entry |
24 |
20: 2072 82880 java.lang.ref.SoftReference |
25 |
21: 1807 71528 [Ljava.lang.Object; |
26 |
22: 2206 70592 java.lang.ref.WeakReference |
27 |
23: 934 52304 java.util.LinkedHashMap |
28 |
24: 871 48776 java.beans.MethodDescriptor |
29 |
25: 1442 46144 java.util.concurrent.ConcurrentHashMap$HashEntry |
30 |
26: 804 38592 java.util.HashMap |
31 |
27: 948 37920 java.util.concurrent.ConcurrentHashMap$Segment |
32 |
28: 1621 35696 [Ljava.lang.Class; |
33 |
29: 1313 34880 [Ljava.lang.String; |
34 |
30: 1396 33504 java.util.LinkedList$Entry |
35 |
31: 462 33264 java.lang.reflect.Field |
36 |
32: 1024 32768 java.util.Hashtable$Entry |
37 |
33: 948 31440 [Ljava.util.concurrent.ConcurrentHashMap$HashEntry; |
class name是物件型別,說明如下:
1 |
B byte |
2 |
C char |
3 |
D double |
4 |
F float |
5 |
I int |
6 |
J long |
7 |
Z boolean |
8 |
[ 陣列,如[I表示int[] |
9 |
[L+類名 其他物件 |
還有一個很常用的情況是:用jmap把程序記憶體使用情況dump到檔案中,再用jhat分析檢視。jmap進行dump命令格式如下:
1 |
jmap -dump: format =b, file =dumpFileName |
我一樣地對上面程序ID為21711進行Dump:
1 |
[email protected]:/ # jmap -dump:format=b,file=/tmp/dump.dat 21711 |
2 |
Dumping heap to /tmp/dump.dat ... |
3 |
Heap dump file created |
dump出來的檔案可以用MAT、VisualVM等工具檢視,這裡用jhat檢視:
01 |
[email protected]:/ # jhat -port 9998 /tmp/dump.dat |
02 |
Reading from /tmp/dump.dat... |
03 |
Dump file created Tue Jan 28 17:46:14 CST 2014 |
04 |
Snapshot read , resolving... |
05 |
Resolving 132207 objects... |
06 |
Chasing references, expect 26 dots.......................... |
07 |
Eliminating duplicate references.......................... |
08 |
Snapshot resolved. |
09 |
Started HTTP server on port 9998 |
10 |
Server is ready. |
然後就可以在瀏覽器中輸入主機地址:9998查看了:
上面紅線框出來的部分大家可以自己去摸索下,最後一項支援OQL(物件查詢語言)。
D、jstat(JVM統計監測工具)
語法格式如下:
1 |
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ] |
vmid是虛擬機器ID,在Linux/Unix系統上一般就是程序ID。interval是取樣時間間隔。count是取樣數目。比如下面輸出的是GC資訊,取樣時間間隔為250ms,取樣數為4:
1 |
[email protected]:/ # jstat -gc 21711 250 4 |
2 |
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT |
3 |
192.0 192.0 64.0 0.0 6144.0 1854.9 32000.0 4111.6 55296.0 25472.7 702 0.431 3 0.218 0.649 |
4 |
192.0 192.0 64.0 0.0 6144.0 1972.2 32000.0 4111.6 55296.0 25472.7 702 0.431 3 0.218 0.649 |
5 |
192.0 192.0 64.0 0.0 6144.0 1972.2 32000.0 4111.6 55296.0 25472.7 702 0.431 3 0.218 0.649 |
6 |
192.0 192.0 64.0 0.0 6144.0 2109.7 32000.0 4111.6 55296.0 25472.7 702 0.431 3 0.218 0.649 |
要明白上面各列的意義,先看JVM堆記憶體佈局:
可以看出:
1 |
堆記憶體 = 年輕代 + 年老代 + 永久代 |
2 |
年輕代 = Eden區 + 兩個Survivor區(From和To) |
現在來解釋各列含義:
1 |
S0C、S1C、S0U、S1U:Survivor 0/1區容量(Capacity)和使用量(Used) |
2 |
EC、EU:Eden區容量和使用量 |
3 |
OC、OU:年老代容量和使用量 |
4 |
PC、PU:永久代容量和使用量 |
5 |
YGC、YGT:年輕代GC次數和GC耗時 |
6 |
FGC、FGCT:Full GC次數和Full GC耗時 |
7 |
GCT:GC總耗時 |
其他JVM效能調優參考資料:
《Java虛擬機器規範》
《Java Performance》
《Effective Java》
對應引數解釋:
使用 TDA 工具,看到大量 Java Thread State 的第一反應是: 1,執行緒狀態為“waiting for monitor entry”: 意味著它 在等待進入一個臨界區 ,所以它在”Entry Set“佇列中等待。 此時執行緒狀態一般都是 Blocked:- java.lang.Thread.State: BLOCKED (on object monitor)
- java.lang.Thread.State: WAITING (parking):一直等那個條件發生;
- java.lang.Thread.State: TIMED_WAITING (parking或sleeping):定時的,那個條件不到來,也將定時喚醒自己。
- java.lang.Thread.State: TIMED_WAITING (on object monitor);
- java.lang.Thread.State: WAITING (on object monitor);
那麼誰持有這個鎖呢? 是另一個先呼叫了 findChanellGoodsCountWithCache 函式的執行緒: "RMI TCP Connection(64878)-172.16.52.117" daemon prio=10 tid=0x0000000040822000 nid=0x6841 runnable [0x00007f2be76b3000] java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) at java.io.BufferedInputStream.read1(BufferedInputStream.java:258) at java.io.BufferedInputStream.read(BufferedInputStream.java:317) - locked <0x00000000af4ed638> (a java.io.BufferedInputStream) at org.bson.io.Bits.readFully(Bits.java:35) at org.bson.io.Bits.readFully(Bits.java:28) at com.mongodb.Response.<init>(Response.java:35) at com.mongodb.DBPort.go(DBPort.java:110) - locked <0x00000000af442d48> (a com.mongodb.DBPort) at com.mongodb.DBPort.go(DBPort.java:75) - locked <0x00000000af442d48> (a com.mongodb.DBPort) at com.mongodb.DBPort.call(DBPort.java:65) at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:202) at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:296) at com.mongodb.DB.command(DB.java:152) at com.mongodb.DBCollection.getCount(DBCollection.java:760) at com.mongodb.DBCollection.getCount(DBCollection.java:731) at com.mongodb.DBCollection.count(DBCollection.java:697) at com.xyz.goods.manager.MongodbManager.count(MongodbManager.java:202) at com.xyz.goods.service.impl.GoodsServiceImpl.findChanellGoodsCount(GoodsServiceImpl.java:1787) at com.xyz.goods.service.impl.GoodsServiceImpl.findChanellGoodsCountWithCache(GoodsServiceImpl.java:1739) - locked <0x00000000fe7e3b50> (a java.lang.String) 示範二: 等待另一個條件發生來將自己喚醒: "RMI TCP Connection(idle)" daemon prio=10 tid=0x00007fd50834e800 nid=0x56b2 waiting on condition [0x00007fd4f1a59000] java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000000acd84de8> (a java.util.concurrent.SynchronousQueue$TransferStack) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198) at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:424) at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:323) at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:874) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:945) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:662) 1)“TIMED_WAITING (parking)”中的 timed_waiting 指等待狀態,但這裡指定了時間,到達指定的時間後自動退出等待狀態;parking指執行緒處於掛起中。 2)“waiting on condition”需要與堆疊中的“parking to wait for <0x00000000acd84de8> (a java.util.concurrent.SynchronousQueue$TransferStack)” 結合來看。首先,本執行緒肯定是在等待某個條件的發生,來把自己喚醒。其次,SynchronousQueue 並不是一個佇列,只是執行緒之間移交資訊的機制,當我們把一個元素放入到 SynchronousQueue 中時必須有另一個執行緒正在等待接受移交的任務,因此這就是本執行緒在等待的條件。 示範三: "RMI RenewClean-[172.16.50.182:4888]" daemon prio=10 tid=0x0000000040d2c800 nid=0x97e in Object.wait() [0x00007f9ccafd0000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x0000000799b032d8> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118) - locked <0x0000000799b032d8> (a java.lang.ref.ReferenceQueue$Lock) at sun.rmi.transport.DGCClient$EndpointEntry$RenewCleanThread.run(DGCClient.java:516) at java.lang.Thread.run(Thread.java:662)
相關推薦
JVM監控命令詳解(轉)
JVM監控命令基本就是 jps、jstack、jmap、jhat、jstat 幾個命令的使用就可以了 JDK本身提供了很多方便的JVM效能調優監控工具,除了整合式的VisualVM和jConsole外,還有jps、jstack、jmap、jhat、jstat
JVM監控命令詳解
想要了解更多,加QQ群72132378 JDK本身提供了很多方便的JVM效能調優監控工具,除了整合式的VisualVM和jConsole外,還有jps、jstack、jmap、jhat、jstat等小巧的工具,本部落格希望能起拋磚引玉之用,讓大家能開始對JVM效能調
JVM監控工具詳解
企業級應用開發中經常會遇到以下問題,可以使用工具對JVM進行監管,以便及時查詢問題所在。 記憶體不足OutOfMemory(大物件沒有gc等),記憶體洩露; 執行緒死鎖,執行緒數過多; 鎖爭用(Lock Contention),資源未及時釋放(資料庫); Java程序CPU消耗過高.
linux系列之常用監控命令詳解
1.top命令 優點:實時掌握OS整體資訊,每隔幾秒鐘會顯示一下OS的資訊,並整理出活躍的程序,顯示這些程序的資訊。 缺點:在實時顯示資訊的情況下,我們不能知道非活躍程序的資訊,如果需要知道非活躍程序,就得用ps命令。 ***load average平均負載:1分
Linux效能監控命令詳解:lsof
lsof可以檢視當前系統所有的開啟檔案,在linux環境下,一切皆檔案,通過檔案不僅僅可以訪問常規資料,還可以訪問網路連線和硬體,如傳輸控制協議 (TCP) 和使用者資料報協議 (UDP) 套接字等,系統在後臺都為該應用程式分配了一個檔案描述符,檔案描述符提供了大量關於這個
Linux效能監控命令詳解:free
在系統遇到各種IO瓶頸,記憶體使用率高,cpu使用率高等問題時,我們如何來定位錯誤?linux提供了很多命令來協助我們快速定位到錯誤,free命令是Linux最常用的命令之一:它可以檢視系統的記憶體狀況,包括伺服器的總記憶體,已經使用的記憶體和剩下未被使用的記憶體,以及緩衝區和快取各自佔用的
Linux IO實時監控iostat命令詳解
-s ref 系統調用 grep 統計信息 3.0 byte sts sta 簡介 iostat主要用於監控系統設備的IO負載情況,iostat首次運行時顯示自系統啟動開始的各項統計信息,之後運行iostat將顯示自上次運行該命令以後的統計信息。用戶可以通過指定統計的次數和
進程實時監控pidstat命令詳解
實例 使用 init 選項 count clu 獲取 6.2 磁盤io pidstat主要用於監控全部或指定進程占用系統資源的情況,如CPU,內存、設備IO、任務切換、線程等。pidstat首次運行時顯示自系統啟動開始的各項統計信息,之後運行pidstat將顯示自上次運行該
效能測試監控 top命令詳解
top命令可以實時動態地檢視系統的整體執行情況,是一個綜合了多方資訊監測系統性能和執行資訊的實用工具。通過top命令所提供的互動式介面,用熱鍵可以管理。 語法 top(選項) 選項 -b:以批處理模式操作; -c:顯示完整的治命令; -d:螢幕重新整理間隔時間; -I:忽
Linux監控工具vmstat命令詳解
原帖地址:http://www.ha97.com/4512.html 一、前言 很顯然從名字中我們就可以知道vmstat是一個檢視虛擬記憶體(Virtual Memory)使用狀況的工具,但是怎樣通過vmstat來發現系統中的瓶頸呢?在回答這個問題前,還是讓我們回顧一下Linux
Linux效能監控分析命令—vmstat命令詳解
一、vmstat介紹 語法格式: vmstat [-V] [-n] [-S unit] [delay [count]] -V prints version. -n causes the headers not to
Linux基礎知識之IO效能監控工具iostat命令詳解
Linux系統出現了效能問題,一般我們可以通過top、iostat、free、vmstat等命令來檢視初步定位問題。其中iostat可以提供更豐富的IO效能狀態資料。 1. 基本使用 $iostat -d -k 1 10 引數 -d 表示,顯示裝置(磁碟)使用狀態;-k某些使用block為單位的列強
Linux 執行程序實時監控pidstat命令詳解
簡介 pidstat主要用於監控全部或指定程序佔用系統資源的情況,如CPU,記憶體、裝置IO、任務切換、執行緒等。pidstat首次執行時顯示自系統啟動開始的各項統計資訊,之後執行pidstat將顯示自上次執行該命令以後的統計資訊。使用者可以通過指定統計的次數和時間來
JVM常用工具命令詳解
JPS 檢視當前執行java程序 JVM Process Status Tool,顯示指定系統內所有的HotSpot虛擬機器程序。 jps -lvm 用於檢視當前機器上執行的java程序。 命令格式 jps [options] [hostid] 注:如果不指定host
Linux網路流量實時監控ifstat iftop命令詳解
ifstat 介紹 ifstat工具是個網路介面監測工具,比較簡單看網路流量 例項 預設使用 #ifstat eth0 eth1 KB/s in KB/s out KB/s in KB/s o
Linux程序實時IO監控iotop命令詳解
Total DISK READ: 6.01 M/s | Total DISK WRITE: 3.85 K/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
JVM 中jstack命令詳解
Java程式問題定位時執行緒棧資訊是一個重要線索,如下圖:“Thread-1” prio=6 tid=0x05b84800 nid=0x660 waiting for monitor entry [0x
tar命令詳解
pan 詳解 time border 設備 lin bsp force names 解壓到指定目錄 tar -zxvf flash_player_npapi_linux.x86_64.tar.gz -C mmtar -zxvf flash_player_npapi_linu
Linux下安裝軟件命令詳解
代碼包 相關信息 make bin 一個 軟件包 輸入 -i bin文件 Linux下軟件安裝方法總結:一、rpm包安裝方式步驟:1、找到相應的軟件包,比如soft.version.rpm,下載到本機某個目錄;2、打開一個終端,su -成root用戶;3、cd soft.v
Docker常用命令詳解
nbsp 詳解 .cn 本地 test 並且 www 更多 top docker ps 查看當前正在運行的容器 docker ps -a 查看所有容器的狀態 docker start/stop id/name 啟動/停止某個容器 docker attach id 進