找回密码
 立即注册
首页 业界区 业界 使用java代码获取JVM信息

使用java代码获取JVM信息

接快背 前天 21:54
转载请注明出处:
  最近在环境中定位服务问题,由于服务使用的docker部署的,且使用的docker镜像,在启动之后,容器内没有jdk相关的工具【jstat、jmap等等】;于是采用 在项目中使用java类获取jvm相关信息,以下是测试的示例:
  1. import java.lang.management.ManagementFactory;  
  2. import java.lang.management.MemoryMXBean;  
  3. import java.lang.management.MemoryUsage;  
  4. import java.lang.management.GarbageCollectorMXBean;  
  5. import java.lang.management.MemoryPoolMXBean;  
  6. import java.lang.management.ThreadMXBean;  
  7. import java.util.List;  
  8. public class GCInfoDemo {  
  9.     public static void main(String[] args) {  
  10.         // 获取内存管理 bean  
  11.         MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();  
  12.         MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();  
  13.         MemoryUsage nonHeapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage();  
  14.         // 打印内存信息  
  15.         System.out.println("Heap Memory Usage:");  
  16.         System.out.println("  Init: " + heapMemoryUsage.getInit() / (1024 * 1024) + " MB");  
  17.         System.out.println("  Used: " + heapMemoryUsage.getUsed() / (1024 * 1024) + " MB");  
  18.         System.out.println("  Committed: " + heapMemoryUsage.getCommitted() / (1024 * 1024) + " MB");  
  19.         System.out.println("  Max: " + heapMemoryUsage.getMax() / (1024 * 1024) + " MB");  
  20.         
  21.         System.out.println("\nNon-Heap Memory Usage:");  
  22.         System.out.println("  Init: " + nonHeapMemoryUsage.getInit() / (1024 * 1024) + " MB");  
  23.         System.out.println("  Used: " + nonHeapMemoryUsage.getUsed() / (1024 * 1024) + " MB");  
  24.         System.out.println("  Committed: " + nonHeapMemoryUsage.getCommitted() / (1024 * 1024) + " MB");  
  25.         System.out.println("  Max: " + nonHeapMemoryUsage.getMax() / (1024 * 1024) + " MB");  
  26.         // 获取垃圾回收回收器 bean 的列表  
  27.         List<GarbageCollectorMXBean> gcBeans = ManagementFactory.getGarbageCollectorMXBeans();  
  28.         System.out.println("\nGarbage Collectors:");  
  29.         for (GarbageCollectorMXBean gcBean : gcBeans) {  
  30.             System.out.println("  Name: " + gcBean.getName());  
  31.             System.out.println("  Number of collections: " + gcBean.getCollectionCount());  
  32.             System.out.println("  Total time spent in collections: " + gcBean.getCollectionTime() + " ms");  
  33.         }  
  34.         // 打印内存池信息  
  35.         System.out.println("\nMemory Pools:");  
  36.         for (MemoryPoolMXBean memoryPool : ManagementFactory.getMemoryPoolMXBeans()) {  
  37.             System.out.println("  Name: " + memoryPool.getName());  
  38.             System.out.println("  Usage: " + memoryPool.getUsage());  
  39.         }  
  40.         // 获取线程管理 bean  
  41.         ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();  
  42.         
  43.         // 获取所有线程 ID  
  44.         long[] threadIds = threadMXBean.getAllThreadIds();  
  45.         System.out.println("\nThreads Information:");  
  46.         for (long threadId : threadIds) {  
  47.             System.out.println("  Thread ID: " + threadId);  
  48.             System.out.println("  Thread Name: " + threadMXBean.getThreadInfo(threadId).getThreadName());  
  49.             System.out.println("  Thread State: " + threadMXBean.getThreadInfo(threadId).getThreadState());  
  50.         }  
  51.         // 检查死锁线程  
  52.         long[] deadlockedThreads = threadMXBean.findDeadlockedThreads();  
  53.         if (deadlockedThreads != null) {  
  54.             System.out.println("\nDeadlocked Threads:");  
  55.             for (long deadlockedThreadId : deadlockedThreads) {  
  56.                 System.out.println("  Deadlocked Thread ID: " + deadlockedThreadId);  
  57.                 System.out.println("  Thread Name: " + threadMXBean.getThreadInfo(deadlockedThreadId).getThreadName());  
  58.             }  
  59.         } else {  
  60.             System.out.println("\nNo deadlocked threads found.");  
  61.         }  
  62.     }  
  63. }  
复制代码

  • 获取GC信息

    • 通过ManagementFactory.getGarbageCollectorMXBeans()获取所有垃圾回收器的监控Bean。
    • 每个GarbageCollectorMXBean提供:

      • getName():GC算法名称(如G1 Young Generation)
      • getCollectionCount():回收次数
      • getCollectionTime():累计耗时(毫秒)


    2.打印当前线程信息:



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

    3.检查死锁线程:



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

  1. Heap Memory Usage:
  2.   Init: 508 MB
  3.   Used: 10 MB
  4.   Committed: 487 MB
  5.   Max: 7205 MB
  6. Non-Heap Memory Usage:
  7.   Init: 2 MB
  8.   Used: 4 MB
  9.   Committed: 7 MB
  10.   Max: 0 MB
  11. Garbage Collectors:
  12.   Name: PS Scavenge
  13.   Number of collections: 0
  14.   Total time spent in collections: 0 ms
  15.   Name: PS MarkSweep
  16.   Number of collections: 0
  17.   Total time spent in collections: 0 ms
  18. Memory Pools:
  19.   Name: Code Cache
  20.   Usage: init = 2555904(2496K) used = 1235968(1207K) committed = 2555904(2496K) max = 251658240(245760K)
  21.   Name: Metaspace
  22.   Usage: init = 0(0K) used = 3597432(3513K) committed = 4980736(4864K) max = -1(-1K)
  23.   Name: Compressed Class Space
  24.   Usage: init = 0(0K) used = 392584(383K) committed = 524288(512K) max = 1073741824(1048576K)
  25.   Name: PS Eden Space
  26.   Usage: init = 133169152(130048K) used = 10914704(10658K) committed = 133169152(130048K) max = 2789212160(2723840K)
  27.   Name: PS Survivor Space
  28.   Usage: init = 22020096(21504K) used = 0(0K) committed = 22020096(21504K) max = 22020096(21504K)
  29.   Name: PS Old Gen
  30.   Usage: init = 355467264(347136K) used = 0(0K) committed = 355467264(347136K) max = 5666504704(5533696K)
  31. Threads Information:
  32.   Thread ID: 6
  33.   Thread Name: Monitor Ctrl-Break
  34.   Thread State: RUNNABLE
  35.   Thread ID: 5
  36.   Thread Name: Attach Listener
  37.   Thread State: RUNNABLE
  38.   Thread ID: 4
  39.   Thread Name: Signal Dispatcher
  40.   Thread State: RUNNABLE
  41.   Thread ID: 3
  42.   Thread Name: Finalizer
  43.   Thread State: WAITING
  44.   Thread ID: 2
  45.   Thread Name: Reference Handler
  46.   Thread State: WAITING
  47.   Thread ID: 1
  48.   Thread Name: main
  49.   Thread State: RUNNABLE
  50. No deadlocked threads found.
  51. Process finished with exit code 0
复制代码
 
 
 
  

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册