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;为了吸引更多的程序员,更…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...

使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...