JAVA代码中获取JVM信息

本文详细介绍了如何使用Java的ManagementFactory类获取JVM的各种信息,包括进程ID、内存使用情况、操作系统信息、线程详情等,为Java开发者提供了深入了解和监控JVM运行状态的方法。

一、JAVA中获取JVM的信息

原理,利用JavaSDK自带的ManagementFactory类来获取。

二、获取信息

1、获取进程ID
@Test
public void test1() {
    RuntimeMXBean mxb = ManagementFactory.getRuntimeMXBean();
    System.out.println(mxb.getName()); //2668@Sindrol-PC
}
2、获取ManagementFactory.getRuntimeMXBean()的其它信息
RuntimeMXBean mxb = ManagementFactory.getRuntimeMXBean();
mxb.getSystemProperties() = {HashMap@866}  size = 56
mxb.getInputArguments() = {Collections$UnmodifiableRandomAccessList@1039}  size = 5
mxb.getBootClassPath() = "C:\Program Files\Java\jdk1.8.0_161\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\sunrsasign.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_161\jre\classes;D:\Applicaton\DevTools\JetBrains\IntelliJIDEA\lib\rt\debugger-agent-storage.jar"
mxb.getLibraryPath() = "C:\Program Files\Java\jdk1.8.0_161\bin;C:\windows\Sun\Java\bin;C:\windows\system32;C:\windows;C:\Program Files\Docker\Docker\Resources\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\libnvvp;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64;D:\Applicaton\DevTools\Python\3.5\Scripts\;D:\Applicaton\DevTools\Python\3.5\;D:\Applicaton\DevTools\cudnn-8.0-windows10-x64-v5.1\cuda;D:\Applicaton\DevTools\cudnn-8.0-windows10-x64-v5.1\cuda\bin;D:\Applicaton\DevTools\cudnn-8.0-windows10-x64-v5.1\cuda\lib\x64;D:\Applicaton\DevTools\cudnn-8.0-windows10-x64-v5.1\cuda\lib;C:\Program Files (x86)\Common Files\NetSarang;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\Program Files\Microsoft\Web Platform Installer\;C:\Program Files (x86)\Microsoft SDKs\Azure\CL"
mxb.getClassPath() = "D:\Applicaton\DevTools\JetBrains\IntelliJIDEA\lib\idea_rt.jar;D:\Applicaton\DevTools\JetBrains\IntelliJIDEA\plugins\junit\lib\junit-rt.jar;D:\Applicaton\DevTools\JetBrains\IntelliJIDEA\plugins\junit\lib\junit5-rt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunpkcs11.jar;C:\Pr"
mxb.getManagementSpecVersion() = "1.2"
mxb.getSpecName() = "Java Virtual Machine Specification"
mxb.getSpecVendor() = "Oracle Corporation"
mxb.getStartTime() = 1527587462275
mxb.getUptime() = 95372
mxb.getVmVendor() = "Oracle Corporation"
mxb.getObjectName() = {ObjectName@1052} "java.lang:type=Runtime"
mxb.getName() = "2668@Sindrol-NTB"
3、获取操作系统信息
@Test
public void test2() {
	OperatingSystemMXBean osb = ManagementFactory.getOperatingSystemMXBean();
	System.out.println(osb.getName()); //Windows 10
	System.out.println(osb.getArch()); //amd 64
	System.out.println(osb.getAvailableProcessors()); //4
	System.out.println(osb.getVersion()); //10.0
	System.out.println(osb.getSystemLoadAverage()); //-1.0
}
4、获取JVM的内存
@Test
public void test4() {
	MemoryMXBean mxb = ManagementFactory.getMemoryMXBean();
	//Heap
	System.out.println("Max:" + mxb.getHeapMemoryUsage().getMax() / 1024 / 1024 + "MB");    //Max:1776MB
	System.out.println("Init:" + mxb.getHeapMemoryUsage().getInit() / 1024 / 1024 + "MB");  //Init:126MB
	System.out.println("Committed:" + mxb.getHeapMemoryUsage().getCommitted() / 1024 / 1024 + "MB");   //Committed:121MB
	System.out.println("Used:" + mxb.getHeapMemoryUsage().getUsed() / 1024 / 1024 + "MB");  //Used:7MB
	System.out.println(mxb.getHeapMemoryUsage().toString());    //init = 132120576(129024K) used = 8076528(7887K) committed = 126877696(123904K) max = 1862270976(1818624K)
	
	//Non heap
	System.out.println("Max:" + mxb.getNonHeapMemoryUsage().getMax() / 1024 / 1024 + "MB");    //Max:0MB
	System.out.println("Init:" + mxb.getNonHeapMemoryUsage().getInit() / 1024 / 1024 + "MB");  //Init:2MB
	System.out.println("Committed:" + mxb.getNonHeapMemoryUsage().getCommitted() / 1024 / 1024 + "MB");   //Committed:8MB
	System.out.println("Used:" + mxb.getNonHeapMemoryUsage().getUsed() / 1024 / 1024 + "MB");  //Used:7MB
	System.out.println(mxb.getNonHeapMemoryUsage().toString());    //init = 2555904(2496K) used = 7802056(7619K) committed = 9109504(8896K) max = -1(-1K)
}
5、获取JVM的内存池情况
@Test
public void test5() {
    List<MemoryPoolMXBean> mxb = ManagementFactory.getMemoryPoolMXBeans();
    for (MemoryPoolMXBean memoryPoolMXBean : mxb) {
        System.out.println("Name:" + memoryPoolMXBean.getName());
        System.out.println("Usage:" + memoryPoolMXBean.getUsage());
        System.out.println("Manager:" + String.join(",", memoryPoolMXBean.getMemoryManagerNames()));
        System.out.println("Type:" + memoryPoolMXBean.getType());
        System.out.println("--------------------------");
    }

}

结果:

Name:Code Cache
Usage:init = 2555904(2496K) used = 1742656(1701K) committed = 2555904(2496K) max = 251658240(245760K)
Manager:CodeCacheManager
Type:Non-heap memory
--------------------------
Name:Metaspace
Usage:init = 0(0K) used = 5436960(5309K) committed = 5767168(5632K) max = -1(-1K)
Manager:Metaspace Manager
Type:Non-heap memory
--------------------------
Name:Compressed Class Space
Usage:init = 0(0K) used = 632000(617K) committed = 786432(768K) max = 1073741824(1048576K)
Manager:Metaspace Manager
Type:Non-heap memory
--------------------------
Name:PS Eden Space
Usage:init = 33554432(32768K) used = 8076056(7886K) committed = 33554432(32768K) max = 687865856(671744K)
Manager:PS MarkSweep,PS Scavenge
Type:Heap memory
--------------------------
Name:PS Survivor Space
Usage:init = 5242880(5120K) used = 0(0K) committed = 5242880(5120K) max = 5242880(5120K)
Manager:PS MarkSweep,PS Scavenge
Type:Heap memory
--------------------------
Name:PS Old Gen
Usage:init = 88080384(86016K) used = 0(0K) committed = 88080384(86016K) max = 1396703232(1363968K)
Manager:PS MarkSweep
Type:Heap memory
--------------------------
6、获取程序线程信息
@Test
public void test6() {
    ThreadMXBean tmx = ManagementFactory.getThreadMXBean();
    System.out.println("thread count:" + tmx.getThreadCount());
    for (long id : tmx.getAllThreadIds()) {
        ThreadInfo ti = tmx.getThreadInfo(id);
        System.out.println(ti.toString().trim());
        System.out.println("cpu time:" + tmx.getThreadCpuTime(id));
        System.out.println("user time:" + tmx.getThreadUserTime(id));
        System.out.println("-----------------");
    }
    System.out.println("findDeadlockedThreads:");
    if (tmx.findDeadlockedThreads() != null)
        for (long id : tmx.findDeadlockedThreads()) {
            ThreadInfo ti = tmx.getThreadInfo(id);
            System.out.println(ti.toString().trim());
        }
}

结果:

thread count:6
"Monitor Ctrl-Break" Id=6 RUNNABLE (in native)
cpu time:0
user time:0
-----------------
"Attach Listener" Id=5 RUNNABLE
cpu time:0
user time:0
-----------------
"Signal Dispatcher" Id=4 RUNNABLE
cpu time:0
user time:0
-----------------
"Finalizer" Id=3 WAITING on java.lang.ref.ReferenceQueue$Lock@22927a81
cpu time:0
user time:0
-----------------
"Reference Handler" Id=2 WAITING on java.lang.ref.Reference$Lock@78e03bb5
cpu time:0
user time:0
-----------------
"main" Id=1 RUNNABLE
cpu time:203125000
user time:171875000
-----------------
findDeadlockedThreads:
<think> 首先,用户的问题是关于在Java代码中实现JVM线程数量监控的方法。我需要参考提供的引用内容来构建回答。引用内容涉及JVM监控工具如JConsole、VisualVM、jstat、jstack等,但用户要求的是在Java代码中实现,而不是使用外部工具。 从引用中: - 引用[1]提到了JConsole、VisualVM、jstat等工具,这些都是外部监控工具。 - 引用[2]讨论了使用自定义脚本监控JVM线程和内存。 - 引用[3]和[4]重点介绍了jstack用于线程转储和分析。 用户明确指出:“我想查找在Java代码中实现JVM线程数量监控的方法”,意思是他们想通过编写Java代码来监控线程数量,而不是依赖外部工具。 所以,我需要回想Java标准库或API中如何通过代码获取线程信息Java提供了java.lang.management包,其中ThreadMXBean类可以用于监控线程。 关键点: - ThreadMXBean 接口提供线程系统信息- 使用ManagementFactory.getThreadMXBean()获取ThreadMXBean实例。 - 方法如getThreadCount()返回当前活动的线程数。 - 还可以获取线程详细信息,如getThreadInfo()。 另外,引用中提到jstack,但那是一个命令行工具;在代码中,我们可以用类似的方式通过ThreadMXBean获取线程转储。 回答结构: 1. 介绍如何获取线程数量。 2. 示例代码展示如何实现。 3. 解释如何监控线程状态。 4. 引用相关内容来支持,添加引用标识。 5. 最后生成相关问题。 系统指令: - 使用$...$和$$...$$格式行内和独立数学表达式(但这可能不涉及数学公式)。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在引用的段落末尾添加引用标识。 - 回答结构清晰,逐步解决问题,确保真实可靠。 生成相关问题:基于用户查询,相关问题应围绕监控线程的其他方面或优化。 大纲回答: 1. **介绍方法**:使用Java Management Extensions (JMX),通过ThreadMXBean获取线程数量。 2. **代码示例**:提供简单的Java代码示例。 3. **详细解释**:如何获取线程信息,如线程ID、状态等。 4. **引用支持**:参考提供的引用,如提到jstack工具类似功能。 5. **相关问题**:生成2-3个相关问题。 代码示例: ```java import java.lang.management.ManagementFactory; import java.lang.management.ThreadMXBean; public class ThreadMonitor { public static void main(String[] args) { ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); int threadCount = threadMXBean.getThreadCount(); System.out.println("Current thread count: " + threadCount); } } ``` 添加监控循环: ```java while (true) { int count = threadMXBean.getThreadCount(); System.out.println("Thread count: " + count); Thread.sleep(1000); // 每秒监控一次 } ``` 引用相关部分: - 从引用[4]:jstack用于打印堆栈信息,在代码中可以通过ThreadMXBean获取类似信息。[^4] - 引用[1]提到JConsole和VisualVM,这些是图形化工具,但代码实现是API级别的。[^1] 确保回答真实可靠:ThreadMXBean是标准Java API的一部分。 相关问题: 1. 如何监控JVM内存使用量? 2. 如何在代码中实现线程转储? 3. JVM线程监控的最佳实践是什么? 最后,格式化回答。 </think> ### Java代码中实现JVM线程数量监控的方法 在Java代码中监控JVM线程数量,可以通过Java标准库的`java.lang.management`包实现。核心类是`ThreadMXBean`,它提供了获取线程信息的API。以下是逐步实现方法: #### 1. **获取ThreadMXBean实例** - 使用`ManagementFactory.getThreadMXBean()`获取线程管理Bean的实例。 - `ThreadMXBean`提供线程数量、状态等监控方法。 #### 2. **监控线程数量** - `getThreadCount()`方法返回当前活动的线程数。 - 示例代码:定期打印线程数量。 ```java import java.lang.management.ManagementFactory; import java.lang.management.ThreadMXBean; public class ThreadMonitor { public static void main(String[] args) { ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); while (true) { int threadCount = threadMXBean.getThreadCount(); System.out.println("当前线程数量: " + threadCount); try { Thread.sleep(5000); // 每5秒监控一次 } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` #### 3. **获取线程详细信息** - `getThreadInfo()`方法返回线程的详细信息(如ID、名称、状态)。 - 示例代码:监控并输出所有线程状态。 ```java import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; public class DetailedThreadMonitor { public static void main(String[] args) { ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); while (true) { long[] threadIds = threadMXBean.getAllThreadIds(); for (long id : threadIds) { ThreadInfo threadInfo = threadMXBean.getThreadInfo(id); System.out.println("线程ID: " + id + ", 名称: " + threadInfo.getThreadName() + ", 状态: " + threadInfo.getThreadState()); } try { Thread.sleep(10000); // 每10秒监控一次 } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` #### 4. **监控线程状态变化** - 结合`ThreadMXBean`和自定义逻辑,可检测线程泄漏或死锁。 - 例如:使用`findDeadlockedThreads()`检测死锁线程。 ```java ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); long[] deadlockedThreads = threadMXBean.findDeadlockedThreads(); if (deadlockedThreads != null) { System.out.println("检测到死锁线程数量: " + deadlockedThreads.length); } ``` #### 注意事项 - **性能开销**:频繁调用`getThreadInfo()`可能影响性能,建议监控间隔≥1秒[^2]。 - **兼容性**:此方法适用于Java 5及以上版本。 - **工具集成**:类似JConsole或jstack的原理,但直接在代码中实现更灵活[^1][^4]。 通过以上方法,可在Java应用中实时监控线程数量,辅助性能优化和问题诊断[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值