使用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

相关推荐
书院门前细致的苹果10 小时前
JVM 全面详解:深入理解 Java 的核心运行机制
java·jvm
稻草人想看远方11 小时前
GC垃圾回收
java·开发语言·jvm
我真的是大笨蛋13 小时前
从源码和设计模式深挖AQS(AbstractQueuedSynchronizer)
java·jvm·设计模式
我真的是大笨蛋16 小时前
G1 垃圾收集器深入解析
java·jvm·笔记·缓存
好多1718 小时前
《JVM如何排查OOM》
开发语言·jvm·python
getdu21 小时前
JVM第一部分
jvm
海梨花1 天前
字节一面 面经(补充版)
jvm·redis·后端·面试·juc
Mr_Xuhhh1 天前
项目-sqlite类的实现
java·jvm·sqlite
佛祖让我来巡山1 天前
深入理解Java对象:从创建到内存访问的JVM底层机制
jvm·对象创建过程·对象是如何创建的
用手手打人1 天前
JVM详解(一)--JVM和Java体系结构
jvm