如何使用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: " + heapMemoryUsagewww.devze.com.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.ge编程客栈tCommitted() / (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");
}
js // 打印内存池信息
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) commVUbLXitted = 4980736(4864K) max = -1(-1K) Name: Compressed Class Space Usage: init = 0(0K) used = 3编程92584(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
到此这篇关于使用java代码获取JVM信息的文章就介绍到这了,更多相关使用java代码获取JVM信息内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
加载中,请稍侯......
精彩评论