如何使用java代碼獲取JVM信息
轉(zhuǎn)載請(qǐng)注明出處:
最近在環(huán)境中定位服務(wù)問(wèn)題,由于服務(wù)使用的docker部署的,且使用的docker鏡像,在啟動(dòng)之后,容器內(nèi)沒(méi)有jdk相關(guān)的工具【jstat、jmap等等】;于是采用 在項(xiàng)目中使用java類獲取jvm相關(guān)信息,以下是測(cè)試的示例:
import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.lang.management.MemoryUsage; import java.lang.management.GarbageCollectorMXBean; import java.lang.management.MemoryPoolMXBean; import java.lang.management.ThreadMXBean; import java.util.List; public class GCInfoDemo { public static void main(String[] args) { // 獲取內(nèi)存管理 bean MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage(); MemoryUsage nonHeapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage(); // 打印內(nèi)存信息 System.out.println("Heap Memory Usage:"); System.out.println(" Init: " + heapMemoryUsage.getInit() / (1024 * 1024) + " MB"); System.out.println(" Used: " + heapMemoryUsage.getUsed() / (1024 * 1024) + " MB"); System.out.println(" Committed: " + heapMemoryUsage.getCommitted() / (1024 * 1024) + " MB"); System.out.println(" Max: " + heapMemoryUsage.getMax() / (1024 * 1024) + " MB"); System.out.println("\nNon-Heap Memory Usage:"); System.out.println(" Init: " + nonHeapMemoryUsage.getInit() / (1024 * 1024) + " MB"); System.out.println(" Used: " + nonHeapMemoryUsage.getUsed() / (1024 * 1024) + " MB"); System.out.println(" Committed: " + nonHeapMemoryUsage.getCommitted() / (1024 * 1024) + " MB"); System.out.println(" Max: " + nonHeapMemoryUsage.getMax() / (1024 * 1024) + " MB"); // 獲取垃圾回收回收器 bean 的列表 List<GarbageCollectorMXBean> gcBeans = ManagementFactory.getGarbageCollectorMXBeans(); System.out.println("\nGarbage Collectors:"); for (GarbageCollectorMXBean gcBean : gcBeans) { System.out.println(" Name: " + gcBean.getName()); System.out.println(" Number of collections: " + gcBean.getCollectionCount()); System.out.println(" Total time spent in collections: " + gcBean.getCollectionTime() + " ms"); } // 打印內(nèi)存池信息 System.out.println("\nMemory Pools:"); for (MemoryPoolMXBean memoryPool : ManagementFactory.getMemoryPoolMXBeans()) { System.out.println(" Name: " + memoryPool.getName()); System.out.println(" Usage: " + memoryPool.getUsage()); } // 獲取線程管理 bean ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); // 獲取所有線程 ID long[] threadIds = threadMXBean.getAllThreadIds(); System.out.println("\nThreads Information:"); for (long threadId : threadIds) { System.out.println(" Thread ID: " + threadId); System.out.println(" Thread Name: " + threadMXBean.getThreadInfo(threadId).getThreadName()); System.out.println(" Thread State: " + threadMXBean.getThreadInfo(threadId).getThreadState()); } // 檢查死鎖線程 long[] deadlockedThreads = threadMXBean.findDeadlockedThreads(); if (deadlockedThreads != null) { System.out.println("\nDeadlocked Threads:"); for (long deadlockedThreadId : deadlockedThreads) { System.out.println(" Deadlocked Thread ID: " + deadlockedThreadId); System.out.println(" Thread Name: " + threadMXBean.getThreadInfo(deadlockedThreadId).getThreadName()); } } else { System.out.println("\nNo deadlocked threads found."); } } }
獲取GC信息
通過(guò)
ManagementFactory.getGarbageCollectorMXBeans()
獲取所有垃圾回收器的監(jiān)控Bean。每個(gè)
GarbageCollectorMXBean
提供:getName()
:GC算法名稱(如G1 Young Generation
)getCollectionCount()
:回收次數(shù)getCollectionTime()
:累計(jì)耗時(shí)(毫秒)
2.打印當(dāng)前線程信息:
- 使用
ThreadMXBean
獲取當(dāng)前線程的所有 ID,并通過(guò)getThreadInfo
方法獲取每個(gè)線程的信息,包括線程名字和狀態(tài)。
- 使用
3.檢查死鎖線程:
- 使用
findDeadlockedThreads
方法檢查 JVM 中的死鎖情況。如果有死鎖線程,則輸出這些線程的 ID 和名稱。如果沒(méi)有,則輸出相應(yīng)的消息。
- 使用
Heap Memory Usage: Init: 508 MB Used: 10 MB Committed: 487 MB Max: 7205 MB Non-Heap Memory Usage: Init: 2 MB Used: 4 MB Committed: 7 MB Max: 0 MB Garbage Collectors: Name: PS Scavenge Number of collections: 0 Total time spent in collections: 0 ms Name: PS MarkSweep Number of collections: 0 Total time spent in collections: 0 ms Memory Pools: Name: Code Cache Usage: init = 2555904(2496K) used = 1235968(1207K) committed = 2555904(2496K) max = 251658240(245760K) Name: Metaspace Usage: init = 0(0K) used = 3597432(3513K) committed = 4980736(4864K) max = -1(-1K) Name: Compressed Class Space Usage: init = 0(0K) used = 392584(383K) committed = 524288(512K) max = 1073741824(1048576K) Name: PS Eden Space Usage: init = 133169152(130048K) used = 10914704(10658K) committed = 133169152(130048K) max = 2789212160(2723840K) Name: PS Survivor Space Usage: init = 22020096(21504K) used = 0(0K) committed = 22020096(21504K) max = 22020096(21504K) Name: PS Old Gen Usage: init = 355467264(347136K) used = 0(0K) committed = 355467264(347136K) max = 5666504704(5533696K) Threads Information: Thread ID: 6 Thread Name: Monitor Ctrl-Break Thread State: RUNNABLE Thread ID: 5 Thread Name: Attach Listener Thread State: RUNNABLE Thread ID: 4 Thread Name: Signal Dispatcher Thread State: RUNNABLE Thread ID: 3 Thread Name: Finalizer Thread State: WAITING Thread ID: 2 Thread Name: Reference Handler Thread State: WAITING Thread ID: 1 Thread Name: main Thread State: RUNNABLE No deadlocked threads found. Process finished with exit code 0
到此這篇關(guān)于使用java代碼獲取JVM信息的文章就介紹到這了,更多相關(guān)使用java代碼獲取JVM信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cloud根據(jù)服務(wù)名獲取服務(wù)的ip端口問(wèn)題
這篇文章主要介紹了Spring Cloud根據(jù)服務(wù)名獲取服務(wù)的ip端口,本篇示例我就以Nacos注冊(cè)中心為例了,下面是我注冊(cè)的兩個(gè)服務(wù),需要的朋友可以參考下2022-09-09談?wù)凷pring 注入properties文件總結(jié)
本篇談?wù)凷pring 注入properties文件總結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01MybatisPlus實(shí)現(xiàn)對(duì)象嵌套關(guān)聯(lián)查詢一對(duì)多List集合查詢
這篇文章主要介紹了MybatisPlus實(shí)現(xiàn)對(duì)象嵌套關(guān)聯(lián)查詢一對(duì)多List集合查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05java中獲取類加載路徑和項(xiàng)目根路徑的5種方式分析
本篇文章介紹了,java中獲取類加載路徑和項(xiàng)目根路徑的5種方式分析。需要的朋友參考下2013-05-05