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;为了吸引更多的程序员,更…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...
GeoServer发布PostgreSQL图层后WFS查询无主键字段
在使用 GeoServer(版本 2.22.2) 发布 PostgreSQL(PostGIS)中的表为地图服务时,常常会遇到一个小问题: WFS 查询中,主键字段(如 id)莫名其妙地消失了! 即使你在…...
