使用java代码获取JVM信息

转载请注明出处:

  最近在环境中定位服务问题,由于服务使用的docker部署的,且使用的docker镜像,在启动之后,容器内没有jdk相关的工具【jstat、jmap等等】;于是采用 在项目中使用java类获取jvm相关信息,以下是测试的示例:

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) {           // 获取内存管理 bean           MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();           MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();           MemoryUsage nonHeapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage();            // 打印内存信息           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");           }            // 打印内存池信息           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.");           }       }   }  

  1. 获取GC信息

    • 通过ManagementFactory.getGarbageCollectorMXBeans()获取所有垃圾回收器的监控Bean。

    • 每个GarbageCollectorMXBean提供:

      • getName():GC算法名称(如G1 Young Generation

      • getCollectionCount():回收次数

      • getCollectionTime():累计耗时(毫秒)

    2.打印当前线程信息:

    • 使用 ThreadMXBean 获取当前线程的所有 ID,并通过 getThreadInfo 方法获取每个线程的信息,包括线程名字和状态。

    3.检查死锁线程:

    • 使用 findDeadlockedThreads 方法检查 JVM 中的死锁情况。如果有死锁线程,则输出这些线程的 ID 和名称。如果没有,则输出相应的消息。
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

 

 

 

  

发表评论

评论已关闭。

相关文章