转载请注明出处:

  最近在环境中定位服务问题,由于服务使用的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

 

  

使用java代码获取JVM信息的更多相关文章

  1. JAVA代码中获取JVM信息

    一.JAVA中获取JVM的信息 原理,利用JavaSDK自带的ManagementFactory类来获取. 二.获取信息 1.获取进程ID @Test public void test1() { Ru ...

  2. 可以获取JVM信息的一些管理工具类

    一些可以获取JVM信息的java工具类 BufferPoolMXBean.class ClassLoadingMXBean.class CompilationMXBean.class GarbageC ...

  3. 用JAVA代码获取Weblogic配置的JNDI 数据源连接

    第一步:生成与JDK版本对应的weblogicjar,利用cmd 进入到weblogic_home 路径下进入到server/lib目录,然后运行  JDK  1.6 命令 "java -j ...

  4. java代码获取客户端的真实ip

    java代码获取客户端的真实ip protected String getIpAddr(HttpServletRequest request) { String ip = request.getHea ...

  5. 通过编写Java代码让Jvm崩溃

    在书上看到一个作者提出一个问题"怎样通过编写Java代码让Jvm崩溃",我看了之后也不懂.带着问题查了一下,百度知道里面有这样一个答案: 1 package jvm; 2 3 pu ...

  6. java sigar获取本地信息以及org.hyperic.sigar.SigarException: The device is not ready报错解决

    window下,使用java sigar 获取磁盘使用率,cpu使用率以及内存使用情况等信息时. 一:首先需要下载jar包和相关文件 sigar-1.6.4.zip 如果想了解更多可以去 sigar官 ...

  7. 通过Java代码获取系统信息

    在开发中,我们需要获取JVM中的信息,以及操作系统信息,内存信息,CPU信息,磁盘信息,网络信息等,通过Java的API不能获取内存等信息,需要sigar的第三方依赖包. ①:加入依赖 <dep ...

  8. Java代码获取NTP服务器时间

    apache的commons-net包下面有ntp相关的实现类,主要类有: 1  org.apache.commons.net.ntp.NTPUDPClient ? 1  org.apache.com ...

  9. Java接口获取系统配置信息

    Java获取当前运行系统的配置信息 接口:System.getProperty() 参数 描述 java.version Java运行时环境版本 java.vendor Java运行时环境供应商 ja ...

  10. java反射-获取方法信息

    例子代码如下: package com.reflect; import java.lang.reflect.Method; public class ClassUtill { /* * 打印类的信息, ...

随机推荐

  1. redux初探

    action是一个普通对象 里面必须有一个type字段,代表将要执行的行为,其他字段自己规划. action只是描述了将要发生的事情并不能直接修改状态 action创建函数 尽量是一个纯函数,他返回的 ...

  2. Superset 用户集成完整方案(iframe方式)

    本次集成方案经过个人测试,根据前面2个集成方案的资料,撰写,相关说明由于个人知识水平有限不一定理解准确,有错误的地方环境评论区评论: 1.用户集成方式: A系统用户,通过A的某个界面,iframe嵌入 ...

  3. bullyBox pg walkthrough Intermediate

    nmap 发现80 和 22端口 访问80 端口发现 跳转 http://bullybox.local/ 在/etc/hosts 里面加上这个域名 dirsearch 扫描的时候发现了.git泄露 用 ...

  4. MacOS修改应用快捷键的一般思路

    具体步骤为: 使用CheatSheet软件查看菜单项名称 在系统设置中修改菜单项的快捷键 举个例子:修改Chrome中左右切换tab的快捷键(系统语言为英文,中文同理) 默认采用Ccontrol Ta ...

  5. Kali 启动默认的服务

    Kali 启动默认的服务 在Kali Linux中,您可以使用systemctl命令来管理服务,包括设置服务的自动启动. 设置Apache服务自动启动 设置 Apache 服务自动启动.执行以下命令: ...

  6. GIS矢量数据获取:全球行政区划、路网、POI点、建筑物范围、信号基站等

      本文对目前主要的行政区边界与道路路网.建筑轮廓.POI.手机基站等数据产品的获取网站加以整理与介绍. 目录 5 行政区边界与建筑轮廓.POI.基站数据 5.1 行政区边界数据 5.1.1 DIVA ...

  7. mybatis之生命周期及作用域

    SqlSessionFactoryBuilder 一旦创建了SqlSessionFactory之后就没有作用了 局部变量 SqlSessionFactory 可以理解为数据库的连接池 SqlSessi ...

  8. Git钩子-每次提交信息添加分支名称

    Git钩子是一组脚本,这些脚本对应着Git仓库中的特定事件,每一次事件发生时,钩子会被触发.这允许你可以定制化Git的内部行为,在开发周期中的关键点上触发执行定制化的脚本. 钩子脚本文件通常放置于项目 ...

  9. 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-14- iframe操作-下篇(详细教程)

    1.简介 通过前边两篇的学习,想必大家已经对iframe有了一定的认识和了解,是不是感觉和Python语言中的差不了多少,大同小异,最多就是不同开发语言的一些语法差异.今天这一篇主要是对iframe做 ...

  10. 并发编程 - 线程同步(八)之自旋锁SpinLock

    前面对互斥锁Monitor进行了详细学习,今天我们将继续学习,一种更轻量级的锁--自旋锁SpinLock. 在 C# 中,SpinLock是一个高效的自旋锁实现,用于提供一种轻量级的锁机制.SpinL ...