java项目运行时信息获取
大体思路如下,想要获取启动时处理器数量、jvm 相关信息,操作系统信息、运行机器信息
运行机器信息
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.lang.invoke.MethodHandles;/*** 机器工具类*/
public abstract class ServerUtils {private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());/*** 获取可用处理器数量** @return*/public static int getAvailableProcessors() {return Runtime.getRuntime().availableProcessors();}public static void printAvailableProcessors() {logger.info("processors={}", Runtime.getRuntime().availableProcessors());}
}
系统信息
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.lang.invoke.MethodHandles;/*** 系统信息工具类** @author Rike* @date 2023/6/28*/
public abstract class SystemUtils {private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());public static String getOsName() {return System.getProperty("os.name");}public static void printOsName() {logger.info("os.name={}", System.getProperty("os.name"));}public static boolean isWindows() {return getOsName().startsWith("Windows");}public static boolean isLinux() {return getOsName().startsWith("Linux");}public static boolean isWindows(String osName) {return osName.startsWith("Windows");}public static boolean isLinux(String osName) {return osName.startsWith("Linux");}
}
通过 System.getProperty() 实现。
jvm 信息
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.lang.invoke.MethodHandles;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;/*** jvm 信息工具类*/
public abstract class JvmUtils {private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());/*** 打印 jvm 信息*/public static void printJvmInfo() {RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();logger.info("jvm name={}", runtimeMXBean.getName());logger.info("class={}", runtimeMXBean.getClass());logger.info("java.class.path={}", runtimeMXBean.getClassPath());logger.info("java.library.path={}", runtimeMXBean.getLibraryPath());logger.info("bootClassPath={}", runtimeMXBean.getBootClassPath());logger.info("java.vm.vendor={}", runtimeMXBean.getVmVendor());logger.info("java.vm.name={}", runtimeMXBean.getVmName());logger.info("java.vm.version={}", runtimeMXBean.getVmVersion());logger.info("java.vm.specification.name={}", runtimeMXBean.getSpecName());logger.info("java.vm.specification.vendor={}", runtimeMXBean.getSpecVendor());logger.info("java.vm.specification.version={}", runtimeMXBean.getSpecVersion());logger.info("java.version={}", System.getProperty("java.version"));logger.info("java.runtime.version={}", System.getProperty("java.runtime.version"));logger.info("java.class.version={}", System.getProperty("java.class.version"));logger.info("inputArguments={}", runtimeMXBean.getInputArguments());logger.info("managementSpecVersion={}", runtimeMXBean.getManagementSpecVersion());logger.info("startTime={}", runtimeMXBean.getStartTime());logger.info("uptime={}", runtimeMXBean.getUptime());/*logger.info("+++++++++++++++++++++++++++++++++++++++");runtimeMXBean.getSystemProperties().entrySet().parallelStream().forEach(entry -> {System.out.println(entry.getKey() + "=" + entry.getValue());});logger.info("+++++++++++++++++++++++++++++++++++++++");*/}
}
通过 ManagementFactory 获取 RuntimeMXBean 对象获取相关信息。
spring 环境信息
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.EnumerablePropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.stereotype.Component;import java.lang.invoke.MethodHandles;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;/*** spring Environment 信息获取工具类*/
@Component
public class SpringEnvironmentUtils implements ApplicationContextAware {private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());private static ConfigurableEnvironment environment = null;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {environment = (ConfigurableEnvironment) applicationContext.getBean(ConfigurableApplicationContext.ENVIRONMENT_BEAN_NAME);}public static void printPropertyValue(String property) {logger.info("[{}]={}", property, environment.getProperty(property));}public static String getPropertyValue(String property) {return environment.getProperty(property);}/*** 打印所有的 Environment 信息*/public static void printAllEnvironmentInfo() {// printSystemEnvironment();// printSystemProperties();printPropertySources();printProfiles();}public static void printSystemEnvironment() {logger.info("+++++++++++++++++++++++++++++++++++++++");logger.info("print system environment begin");logger.info("+++++++++++++++++++++++++++++++++++++++");environment.getSystemEnvironment().entrySet().parallelStream().forEach(entry -> {// System.out.println(entry.getKey() + "=" + entry.getValue());logger.info("{}={}", entry.getKey(), entry.getValue());});logger.info("+++++++++++++++++++++++++++++++++++++++");logger.info("print system environment end");logger.info("+++++++++++++++++++++++++++++++++++++++");Map<String, String> map = System.getenv();map.entrySet().stream().forEach(entry -> {// System.out.println(entry.getKey() + "=" + entry.getValue());logger.info("{}={}", entry.getKey(), entry.getValue());});}public static void printSystemProperties() {logger.info("+++++++++++++++++++++++++++++++++++++++");logger.info("print system properties begin");logger.info("+++++++++++++++++++++++++++++++++++++++");environment.getSystemProperties().entrySet().parallelStream().forEach(entry -> {// System.out.println(entry.getKey() + "=" + entry.getValue());logger.info("{}={}", entry.getKey(), entry.getValue());});logger.info("+++++++++++++++++++++++++++++++++++++++");logger.info("print system properties end");logger.info("+++++++++++++++++++++++++++++++++++++++");}public static void printPropertySources() {logger.info("+++++++++++++++++++++++++++++++++++++++");logger.info("print property sources begin");logger.info("+++++++++++++++++++++++++++++++++++++++");// 筛选继承 EnumerablePropertySource 的类和实现 Map 的类List<PropertySource<?>> list = environment.getPropertySources().stream().filter(ps -> (ps instanceof EnumerablePropertySource && ps.getSource() instanceof Map)).collect(Collectors.toList());list.stream().forEach(ps -> {String name = ps.getName();logger.info("[{}] include property and value begin", name);Map source = (Map) ps.getSource();StringBuffer stringBuffer = new StringBuffer();int size = source.entrySet().size();// 记录当前下标int index = -1;for (Object entry : source.entrySet()) {index++;Map.Entry temp = (Map.Entry) entry;// System.out.println(temp.getKey() + "="+ temp.getValue());// logger.info("{}={}", temp.getKey(), temp.getValue());// 将参数进行拼接方便日志打印stringBuffer.append(temp.getKey()).append("=").append(temp.getValue());/*** 换行符打印的情况** 总数量大于1** 下标小于总数减1**/if (size > 1 && index < size -1) {stringBuffer.append("\n");}}// 拼接的字符串不为空时打印if (stringBuffer.length() > 0) {logger.info("{}", stringBuffer);}logger.info("[{}] include property and value end", name);});logger.info("+++++++++++++++++++++++++++++++++++++++");logger.info("print property sources end");logger.info("+++++++++++++++++++++++++++++++++++++++");}public static void printProfiles() {logger.info("+++++++++++++++++++++++++++++++++++++++");logger.info("print profiles begin");logger.info("+++++++++++++++++++++++++++++++++++++++");String[] defaultProfiles = environment.getDefaultProfiles();logger.info("defaultProfiles={}", defaultProfiles);String[] activeProfiles = environment.getActiveProfiles();logger.info("activeProfiles={}", activeProfiles);logger.info("+++++++++++++++++++++++++++++++++++++++");logger.info("print profiles end");logger.info("+++++++++++++++++++++++++++++++++++++++");}
}
借助于 ApplicationContext 获取 ConfigurableEnvironment 对象,进而获取 System.getProperty() 和 System.getenv() 相关信息。
整合
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;/*** 启动信息*/
@Component
public class StartInfo implements InitializingBean, Ordered {@Overridepublic void afterPropertiesSet() throws Exception {SpringEnvironmentUtils.printPropertyValue("spring.cloud.nacos.server-addr");ServerUtils.printAvailableProcessors();SystemUtils.printOsName();JvmUtils.printJvmInfo();SpringEnvironmentUtils.printAllEnvironmentInfo();}@Overridepublic int getOrder() {return LOWEST_PRECEDENCE;}
}
创建一个类实现 InitializingBean 接口,添加 @Component 注解,在 spring ioc 容器启动时执行其中的逻辑,对代码无侵入性,无需修改其他代码即可实现最终的功能。
参考链接
https://blog.csdn.net/qq742143797/article/details/113553660
相关文章:
java项目运行时信息获取
大体思路如下,想要获取启动时处理器数量、jvm 相关信息,操作系统信息、运行机器信息 运行机器信息 import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.lang.invoke.MethodHandles;/*** 机器工具类*/ public abstract class ServerU…...
【LeetCode】71. 简化路径
1 问题 给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 / 开头),请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身…...
操作系统【OS】进程的控制【进程的创建、终止、阻塞、唤醒】
定义和过程 对应事件 创建 允许一个进程创建另一个进程允许子进程继承父进程所拥有的资源创建进程的过程如下: 申请一个空白的 PCB,并向 PCB 中填写一些控制和管理进程的信息,比如进程的唯一标识等;为该进程分配运行时所必需的…...
写一个简单的解释器(2) 构建标记流
确定标记类型 分为几个大类: 用户符号(类型/标识符/数字/字符串…)关键字 (流程控制和定义符)括号 (这里暂时认为 [] 属于括号)分号 上述四类标记基本囊括了 vc \texttt{vc} vc 中的所有最小单元的类型,但是因为构…...

Leetcode1833. 雪糕的最大数量
Every day a Leetcode 题目来源:1833. 雪糕的最大数量 解法1:贪心 排序 本题唯一的难点在于计数排序。 计数排序详解:C算法之计数排序 为了尽可能多的买到雪糕,我们选择从价格低的雪糕开始买,统计能够买到的雪糕…...

idea 里 没有svn选项的处理办法
总结一下没有svn选项的几种情况: 情况1:IntelliJ IDEA打开带SVN信息的项目不显示SVN信息,项目右键SVN以及图标还有Changes都不显示解决方法 在VCS菜单中有个开关,叫Enabled Version Control Integration,在打开的窗口…...

基于SpringBoot的招生管理系统
基于SpringBoot的招生管理系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringBootMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 主页 登录界面 管理员界面 用户界面 摘要 基于SpringBoot的招生管理系统是一款现…...

01、MySQL-------性能优化
目录 一、影响性能的相关因素存储过程: 二、sql优化1>、Mysql系统架构2>、引擎区别: 3>、索引1、什么是索引?联合主键索引理解:索引长度理解:什么是慢查询? 1)、索引理解2)…...
Flutter - APP跳转高德、百度、腾讯、谷歌地图
demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新,请前往github查看最新代码 这里介绍的是不需要自己开发地图,直接通过给定的经纬度,跳转到三方地图APP调用导航的方式 一种是写的工具类,一种是通过调用三方…...

Flyway Desktop updated
Flyway Desktop updated 为比较工件序列化和反序列化添加了额外的调试日志记录。 Flyway Desktop现在将记住以前用于创建项目和匹配克隆的位置。 新的脱机许可工作流现在已在Microsoft Windows上启用。 现在,在配置目标数据库列表时,环境ID是可见的。 现…...

阿里云短信服务设置操作项目
在这里插入图片描述...

学习笔记|串口通信实战|简易串口控制器|sprintf函数|STC32G单片机视频开发教程(冲哥)|第二十一集(下):串口与PC通信
目录 3.串口通信实战实操简易的工作原理Tips:sprintf函数简介 总结课后练习 3.串口通信实战 做一个简易串口控制器。发送对应指令,让板子做相应的事情,或者传输数据(文本模式下发送,不要选择HEX)。 1.串口发送字符Ax\…...

卷积神经网络CNN学习笔记-卷积计算Conv2D函数的理解
目录 1.全连接层存在的问题2.卷积运算3.填充(padding)3.1填充(padding)的意义 4.步幅(stride)5.三维数据的卷积运算6.结合方块思考7.批处理8.Conv2D函数解析9.conv2d代码9.1 stride19.2 stride2 参考文章 1.全连接层存在的问题 在全连接层中,相邻层的神经元全部连接…...
收藏,安装报错信息汇总,MacOS上安装Adobe等软件/插件报错问题解决合集
打开允许“允许任何来源” 如何打开允许任何来源?在 Finder 菜单栏选择 【前往】 – 【实用工具 】,找到【终端】程序,双击打开,在终端窗口中输入:sudo spctl --master-disable 输入代码后,按【return 回车…...
Qt 报错:munmap_chunk(): invalid pointer解决方案
问题 在用Qt写程序的时候。报了munmap_chunk(): invalid pointer这个错误消息。 造成原因 在 Qt 程序中,这种错误可能出现在多种情况下,以下几点是容易造成此问题的原因: 函数未实现返回值:函数有返回值,但函数体中…...

【Java题】实现继承和多态的例子
一:题目 1.员工类Employee: (1)私有成员变量:姓名,年龄,工资 (2)提供无参,有参构造 (3)成员方法:work()方法——员工工作 …...

‘conda‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
原因:环境变量没有正确添加解决:我的电脑—右键属性—高级系统设置—环境变量—系统变量—Path—双击进入—新建,去安装Anaconda的目录下,找到Library中的bin,将此时的路径粘贴到此处...

C1N短网址 - 是如何做到行业领先的
今天从技术角度来聊下短网址的一些事情,市面上的短网址发展基本上经历了几个阶段。 短网址发展的几个阶段: 第一阶段:网址缩短,很纯粹的功能,各个大小公司都在做,门槛很低。典型代表:百度短网…...

【UE5】引入C++插件Plugins不在UE里出现
原因 未编译过C 原项目为蓝图项目,或者虽然为C项目,但并为编译过C. 解决 创建一个C脚本,让编辑器重启重新编译一遍。 如还不行,则打开Plugins插件面板,创建一个空的新的插件,再让引擎自动重启重新编译…...
第三部分:JavaScript
一:JavaScript介绍 JavaScript语言诞生主要是完成页面的数据验证。因此它运行在客户端,需要运行浏览器来解析执行JavaScript代码。 JavaScript是Net scape网景公司的产品,最早取名为LiveScript;为了吸引更多的程序员,更…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
Git 命令全流程总结
以下是从初始化到版本控制、查看记录、撤回操作的 Git 命令全流程总结,按操作场景分类整理: 一、初始化与基础操作 操作命令初始化仓库git init添加所有文件到暂存区git add .提交到本地仓库git commit -m "提交描述"首次提交需配置身份git c…...

机器学习复习3--模型评估
误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异称为:误差(error)。 误差定义: ①在训练集上的误差称为训练误差(training error)或经验误差(empirical error&#x…...