当前位置: 首页 > news >正文

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项目运行时信息获取

大体思路如下&#xff0c;想要获取启动时处理器数量、jvm 相关信息&#xff0c;操作系统信息、运行机器信息 运行机器信息 import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.lang.invoke.MethodHandles;/*** 机器工具类*/ public abstract class ServerU…...

【LeetCode】71. 简化路径

1 问题 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&#xff09;表示当前目录本身&#xf…...

操作系统【OS】进程的控制【进程的创建、终止、阻塞、唤醒】

定义和过程 对应事件 创建 允许一个进程创建另一个进程允许子进程继承父进程所拥有的资源创建进程的过程如下&#xff1a; 申请一个空白的 PCB&#xff0c;并向 PCB 中填写一些控制和管理进程的信息&#xff0c;比如进程的唯一标识等&#xff1b;为该进程分配运行时所必需的…...

写一个简单的解释器(2) 构建标记流

确定标记类型 分为几个大类&#xff1a; 用户符号&#xff08;类型/标识符/数字/字符串…)关键字 (流程控制和定义符)括号 &#xff08;这里暂时认为 [] 属于括号&#xff09;分号 上述四类标记基本囊括了 vc \texttt{vc} vc 中的所有最小单元的类型&#xff0c;但是因为构…...

Leetcode1833. 雪糕的最大数量

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

idea 里 没有svn选项的处理办法

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

基于SpringBoot的招生管理系统

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

01、MySQL-------性能优化

目录 一、影响性能的相关因素存储过程&#xff1a; 二、sql优化1>、Mysql系统架构2>、引擎区别&#xff1a; 3>、索引1、什么是索引&#xff1f;联合主键索引理解&#xff1a;索引长度理解&#xff1a;什么是慢查询&#xff1f; 1&#xff09;、索引理解2&#xff09;…...

Flutter - APP跳转高德、百度、腾讯、谷歌地图

demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新&#xff0c;请前往github查看最新代码 这里介绍的是不需要自己开发地图&#xff0c;直接通过给定的经纬度&#xff0c;跳转到三方地图APP调用导航的方式 一种是写的工具类&#xff0c;一种是通过调用三方…...

Flyway Desktop updated

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

阿里云短信服务设置操作项目

在这里插入图片描述...

学习笔记|串口通信实战|简易串口控制器|sprintf函数|STC32G单片机视频开发教程(冲哥)|第二十一集(下):串口与PC通信

目录 3.串口通信实战实操简易的工作原理Tips:sprintf函数简介 总结课后练习 3.串口通信实战 做一个简易串口控制器。发送对应指令&#xff0c;让板子做相应的事情&#xff0c;或者传输数据&#xff08;文本模式下发送&#xff0c;不要选择HEX&#xff09;。 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.全连接层存在的问题 在全连接层中&#xff0c;相邻层的神经元全部连接…...

收藏,安装报错信息汇总,MacOS上安装Adobe等软件/插件报错问题解决合集

打开允许“允许任何来源” 如何打开允许任何来源&#xff1f;在 Finder 菜单栏选择 【前往】 – 【实用工具 】&#xff0c;找到【终端】程序&#xff0c;双击打开&#xff0c;在终端窗口中输入&#xff1a;sudo spctl --master-disable 输入代码后&#xff0c;按【return 回车…...

Qt 报错:munmap_chunk(): invalid pointer解决方案

问题 在用Qt写程序的时候。报了munmap_chunk(): invalid pointer这个错误消息。 造成原因 在 Qt 程序中&#xff0c;这种错误可能出现在多种情况下&#xff0c;以下几点是容易造成此问题的原因&#xff1a; 函数未实现返回值&#xff1a;函数有返回值&#xff0c;但函数体中…...

【Java题】实现继承和多态的例子

一&#xff1a;题目 1.员工类Employee&#xff1a; &#xff08;1&#xff09;私有成员变量&#xff1a;姓名&#xff0c;年龄&#xff0c;工资 &#xff08;2&#xff09;提供无参&#xff0c;有参构造 &#xff08;3&#xff09;成员方法&#xff1a;work()方法——员工工作 …...

‘conda‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

原因&#xff1a;环境变量没有正确添加解决&#xff1a;我的电脑—右键属性—高级系统设置—环境变量—系统变量—Path—双击进入—新建&#xff0c;去安装Anaconda的目录下&#xff0c;找到Library中的bin&#xff0c;将此时的路径粘贴到此处...

C1N短网址 - 是如何做到行业领先的

今天从技术角度来聊下短网址的一些事情&#xff0c;市面上的短网址发展基本上经历了几个阶段。 短网址发展的几个阶段&#xff1a; 第一阶段&#xff1a;网址缩短&#xff0c;很纯粹的功能&#xff0c;各个大小公司都在做&#xff0c;门槛很低。典型代表&#xff1a;百度短网…...

【UE5】引入C++插件Plugins不在UE里出现

原因 未编译过C 原项目为蓝图项目&#xff0c;或者虽然为C项目&#xff0c;但并为编译过C. 解决 创建一个C脚本&#xff0c;让编辑器重启重新编译一遍。 如还不行&#xff0c;则打开Plugins插件面板&#xff0c;创建一个空的新的插件&#xff0c;再让引擎自动重启重新编译…...

第三部分:JavaScript

一&#xff1a;JavaScript介绍 JavaScript语言诞生主要是完成页面的数据验证。因此它运行在客户端&#xff0c;需要运行浏览器来解析执行JavaScript代码。 JavaScript是Net scape网景公司的产品&#xff0c;最早取名为LiveScript&#xff1b;为了吸引更多的程序员&#xff0c;更…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...