JVM
STACK
儲存primitype 數值和 ClassType 參考位置
HEAP
儲存實例的位置(STACK參考位置,參考的物件)
Garbage Collection
回收Heap已經沒有被Reference的物件
Copilot thread dump
當你使用 kubectl 來查找和分析 thread dump 時,以下是更詳細的步驟和說明,幫助你查找 thread 異常:
-
列出 POD:
kubectl get pods -n service這個命令會列出指定 namespace (
service) 中的所有 POD。確認你要進入的 POD 名稱。 -
進入 POD:
kubectl exec -it <pod-name> -n service sh使用
kubectl exec進入指定的 POD,這裡<pod-name>是你在上一步中找到的 POD 名稱。-it參數允許你進入交互式 shell。 -
生成 thread dump:
jstack 1 >> thread.txt在 POD 中執行
jstack命令來生成 thread dump,並將輸出重定向到thread.txt文件中。1是 Java 進程的 PID,通常在容器中只有一個 Java 進程。 -
回到本機端:
exit使用
exit命令退出 POD 的 shell,回到本機端。 -
複製 thread dump 文件:
kubectl cp service:<pod-name>:/path/to/thread.txt -n service ./thread.txt使用
kubectl cp命令將 POD 中的thread.txt文件複製到本地機器。這裡<pod-name>是 POD 的名稱,/path/to/thread.txt是文件在 POD 中的路徑。
查找 thread 異常
-
打開 thread dump 文件: 使用文本編輯器(如 VS Code、Notepad++)打開
thread.txt文件。 -
查找關鍵字:
- "BLOCKED": 表示 thread 被鎖住,可能是死鎖的跡象。
- "WAITING" 或 "TIMED_WAITING": 表示 thread 在等待某個條件或超時。
- "RUNNABLE": 表示 thread 正在執行或準備執行。
-
分析 stack trace:
- 查看每個 thread 的 stack trace,找出長時間運行的 thread 或重複出現的調用。
- 特別注意那些涉及同步代碼塊或鎖的部分,這些地方最容易出現死鎖或性能瓶頸。
-
使用工具:
- Thread Dump Analyzer: 有一些工具可以幫助分析 thread dump,例如 Eclipse MAT、VisualVM 等。
- 線上分析工具: 有一些線上工具可以上傳 thread dump 文件並自動分析,例如 FastThread。
Copilot memory dump
查找和分析 memory dump 需要一些額外的步驟和工具。以下是詳細的步驟說明:
生成 Memory Dump
-
列出 POD:
kubectl get pods -n service列出指定 namespace (
service) 中的所有 POD。 -
進入 POD:
kubectl exec -it <pod-name> -n service sh進入指定的 POD。
-
生成 Memory Dump: 使用
jmap工具來生成 memory dump。假設 Java 進程的 PID 是1,可以使用以下命令:jmap -dump:live,format=b,file=heapdump.hprof 1這個命令會生成一個名為
heapdump.hprof的文件,包含當前 Java 進程的 memory dump。 -
回到本機端:
exit使用
exit命令退出 POD 的 shell。 -
複製 Memory Dump 文件:
kubectl cp service:<pod-name>:/path/to/heapdump.hprof -n service ./heapdump.hprof使用
kubectl cp命令將 POD 中的heapdump.hprof文件複製到本地機器。
分析 Memory Dump
-
使用分析工具:
- Eclipse MAT (Memory Analyzer Tool): 一個強大的工具,用於分析 Java heap dump。可以下載並安裝 Eclipse MAT。
- VisualVM: 另一個流行的工具,可以用來分析 heap dump。可以下載並安裝 VisualVM。
-
打開 Memory Dump 文件: 使用上述工具中的一個打開
heapdump.hprof文件。 -
查找異常:
- 內存泄漏: 查看哪些對象佔用了大量內存,並檢查是否有不必要的對象長時間存在。
- GC Roots: 分析 GC Roots,找出哪些對象無法被垃圾回收。
- Dominators: 使用 Dominator Tree 分析,找出內存佔用最多的對象。
-
生成報告: 工具通常會生成詳細的報告,幫助你理解內存使用情況和潛在的問題。