接快背 发表于 2025-6-2 21:54:24

使用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.");
      }
    }
}
[*]获取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 
 
 
  

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 使用java代码获取JVM信息