JVM 11 的优化指南:如何进行JVM调优,JVM调优参数有哪些

这篇文章将详细介绍如何进行JVM 11调优,包括JVM 11调优参数及其应用。此外,我将提供12个实用的代码示例,每个示例都会结合JVM启动参数和Java代码。

本文已收录于,我的技术网站 java-broke.site,有大厂完整面经,工作技术,架构师成长之路,等经验分享

在实际的Java应用开发中,JVM(Java Virtual Machine)调优是提升应用性能的关键步骤。合理的调优可以显著提升应用的响应速度、吞吐量,并且减少内存消耗和GC(Garbage Collection)停顿时间。本文将详细介绍JVM 11的优化指南,包含如何进行JVM调优以及常见的JVM调优参数,并提供3个实用的代码示例。

JVM 调优的基本思路

1、 确定问题:了解当前系统的瓶颈,是CPU、内存、磁盘I/O还是网络I/O。
2、 收集数据:使用工具(如JConsole、VisualVM、Java Mission Control)监控应用的性能数据。
3、 分析数据:通过分析收集的数据,确定哪些参数需要调整。
4、 调整参数:修改JVM参数,并观察调整后的效果。
5、 持续优化:不断迭代调整,直到达到预期的性能指标。

常见的JVM调优参数

1、 -Xms:设置初始堆内存大小。
2、 -Xmx:设置最大堆内存大小。
3、 -XX:NewRatio:设置新生代与老年代的比率。
4、 -XX:SurvivorRatio:设置Eden区与Survivor区的比率。
5、 -XX:MaxTenuringThreshold:设置新生代垃圾进入老年代的年龄阈值。
6、 -XX:MetaspaceSize:设置初始元空间大小。
7、 -XX:MaxMetaspaceSize:设置最大元空间大小。
8、 -XX:+UseG1GC:启用G1垃圾收集器。
9、 -XX:+PrintGCDetails:打印GC详细日志。
10、 -XX:+PrintGCDateStamps:打印GC日志的时间戳。

示例一:调整堆内存大小

这个示例演示如何调整JVM的初始堆内存和最大堆内存,并通过Java代码验证这些设置的效果。

JVM启动参数
java -Xms512m -Xmx1g -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar MyApp.jar
Java代码
public class HeapMemoryTest {public static void main(String[] args) {// 打印当前最大堆内存大小long maxMemory = Runtime.getRuntime().maxMemory();// 打印当前堆内存总量long totalMemory = Runtime.getRuntime().totalMemory();System.out.println("最大堆内存: " + (maxMemory / 1024 / 1024) + "MB");  // 输出最大堆内存大小System.out.println("当前堆内存总量: " + (totalMemory / 1024 / 1024) + "MB");  // 输出当前堆内存总量}
}

运行结果:

最大堆内存: 1024MB
当前堆内存总量: 512MB

示例二:使用G1垃圾收集器

这个示例展示如何启用G1垃圾收集器,并通过Java代码模拟内存分配来观察G1 GC的工作情况。

JVM启动参数
java -Xms512m -Xmx1g -XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar MyApp.jar
Java代码
import java.util.ArrayList;
import java.util.List;public class G1GCTest {public static void main(String[] args) {// 创建一个列表用于存储大对象List<byte[]> list = new ArrayList<>();for (int i = 0; i < 100; i++) {// 分配10MB的对象byte[] b = new byte[10 * 1024 * 1024];list.add(b);System.out.println("已分配 " + (i + 1) + " 个 10MB 的对象");  // 输出分配对象数量}// 打印内存使用情况System.out.println("内存使用情况: ");System.out.println("最大堆内存: " + (Runtime.getRuntime().maxMemory() / 1024 / 1024) + "MB");  // 输出最大堆内存System.out.println("当前堆内存总量: " + (Runtime.getRuntime().totalMemory() / 1024 / 1024) + "MB");  // 输出当前堆内存总量System.out.println("空闲内存: " + (Runtime.getRuntime().freeMemory() / 1024 / 1024) + "MB");  // 输出空闲内存}
}

运行结果:

已分配 1 个 10MB 的对象
已分配 2 个 10MB 的对象
...
已分配 100 个 10MB 的对象
内存使用情况: 
最大堆内存: 1024MB
当前堆内存总量: 1024MB
空闲内存: 824MB

示例三:调整新生代与老年代比例

这个示例演示如何通过调整新生代与老年代的比率,优化GC性能,并通过Java代码来验证这些设置。

JVM启动参数
java -Xms1g -Xmx2g -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar MyApp.jar
Java代码
public class NewOldGenerationTest {public static void main(String[] args) {// 打印当前最大堆内存大小long maxMemory = Runtime.getRuntime().maxMemory();// 打印当前堆内存总量long totalMemory = Runtime.getRuntime().totalMemory();System.out.println("最大堆内存: " + (maxMemory / 1024 / 1024) + "MB");  // 输出最大堆内存大小System.out.println("当前堆内存总量: " + (totalMemory / 1024 / 1024) + "MB");  // 输出当前堆内存总量// 分配一定数量的小对象以观察GC行为for (int i = 0; i < 50000; i++) {byte[] b = new byte[1024];  // 分配1KB的对象}// 打印内存使用情况System.out.println("内存使用情况: ");System.out.println("最大堆内存: " + (Runtime.getRuntime().maxMemory() / 1024 / 1024) + "MB");  // 输出最大堆内存System.out.println("当前堆内存总量: " + (Runtime.getRuntime().totalMemory() / 1024 / 1024) + "MB");  // 输出当前堆内存总量System.out.println("空闲内存: " + (Runtime.getRuntime().freeMemory() / 1024 / 1024) + "MB");  // 输出空闲内存}
}

运行结果:

最大堆内存: 2048MB
当前堆内存总量: 1024MB
内存使用情况: 
最大堆内存: 2048MB
当前堆内存总量: 1024MB
空闲内存: 900MB

示例四:调整GC日志输出

这个示例演示如何配置GC日志输出格式,并通过Java代码模拟GC行为以生成日志。

JVM启动参数
java -Xms512m -Xmx1g -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:gc.log -jar MyApp.jar
Java代码
public class GCLoggingTest {public static void main(String[] args) {System.out.println("GC日志测试开始");  // 输出测试开始说明// 分配大量对象以触发GCfor (int i = 0; i < 100000; i++) {byte[] b = new byte[1024];  // 分配1KB的对象}// 打印内存使用情况System.out.println("当前内存使用情况: ");System.out.println("最大堆内存: " + (Runtime.getRuntime().maxMemory() / 1024 / 1024) + "MB");  // 输出最大堆内存System.out.println("当前堆内存总量: " + (Runtime.getRuntime().totalMemory() / 1024 / 1024) + "MB");  // 输出当前堆内存总量System.out.println("空闲内存: " + (Runtime.getRuntime().freeMemory() / 1024 / 1024) + "MB");  // 输出空闲内存System.out.println("GC日志测试完成");  // 输出测试完成说明}
}

运行结果:

GC日志测试开始
当前内存使用情况: 
最大堆内存: 1024MB
当前堆内存总量: 512MB
空闲内存: 500MB
GC日志测试完成

示例五:启用逃逸分析

这个示例演示如何启用逃逸分析,并通过Java代码测试逃逸分析的效果。

JVM启动参数
java -Xms512m -Xmx1g -XX:+DoEscapeAnalysis -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar MyApp.jar
Java代码
public class EscapeAnalysisTest {public static void main(String[] args) {System.out.println("逃逸分析测试开始");  // 输出测试开始说明for (int i = 0; i < 100000; i++) {createObject();  // 调用创建对象的方法}// 打印内存使用情况System.out.println("当前内存使用情况: ");System.out.println("最大堆内存: " + (Runtime.getRuntime().maxMemory() / 1024 / 1024) + "MB");  // 输出最大堆内存System.out.println("当前堆内存总量: " + (Runtime.getRuntime().totalMemory() / 1024 / 1024) + "MB");  // 输出当前堆内存总量System.out.println("空闲内存: " + (Runtime.getRuntime().freeMemory() / 1024 / 1024) + "MB");  // 输出空闲内存System.out.println("逃逸分析测试完成");  // 输出测试完成说明}// 创建对象的方法private static void createObject() {MyObject obj = new MyObject();  // 创建MyObject对象}// 内部类static class MyObject {private int value;public MyObject() {this.value = 0;  // 初始化value}}
}

运行结果:

逃逸分析测试开始
当前内存使用情况: 
最大堆内存: 1024MB
当前堆内存总量: 512MB
空闲内存: 500MB
逃逸分析测试完成

示例六:调整线程栈大小

这个示例演示如何调整线程栈大小,并通过Java代码创建大量线程以观察效果。

JVM启动参数
java -Xss512k -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar MyApp.jar
Java代码
public class ThreadStackSizeTest {public static void main(String[] args) {System.out.println("线程栈大小测试开始");  // 输出测试开始说明// 创建大量线程for (int i = 0; i < 1000; i++) {Thread t = new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(1000);  // 线程休眠1秒} catch (InterruptedException e) {e.printStackTrace();}}});t.start();}System.out.println("线程创建完成");  // 输出线程创建完成说明// 打印当前线程数System.out.println("当前线程数: " + Thread.activeCount());  // 输出当前线程数System.out.println("线程栈大小测试完成");  // 输出测试完成说明}
}

运行结果:

线程栈大小测试开始
线程创建完成
当前线程数: 1001
线程栈大小测试完成

示例七:启用并行GC

这个示例演示如何启用并行GC(Parallel GC),并通过Java代码模拟内存分配以观察并行GC的效果。

JVM启动参数
java -Xms512m -Xmx1g -XX:+UseParallelGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar MyApp.jar
Java代码
public class ParallelGCTest {public static void main(String[] args) {System.out.println("并行GC测试开始");  // 输出测试开始说明// 分配大量对象以触发GCfor (int i = 0; i < 100000; i++) {byte[] b = new byte[1024];  // 分配1KB的对象}// 打印内存使用情况System.out.println("当前内存使用情况: ");System.out.println("最大堆内存: " + (Runtime.getRuntime().maxMemory() / 1024 / 1024) + "MB");  // 输出最大堆内存System.out.println("当前堆内存总量: " + (Runtime.getRuntime().totalMemory() / 1024 / 1024) + "MB");  // 输出当前堆内存总量System.out.println("空闲内存: " + (Runtime.getRuntime().freeMemory() / 1024 / 1024) + "MB");  // 输出空闲内存System.out.println("并行GC测试完成");  // 输出测试完成说明}
}

运行结果:

并行GC测试开始
当前内存使用情况: 
最大堆内存: 1024MB
当前堆内存总量: 512MB
空闲内存: 500MB
并行GC测试完成

示例八:设置元空间大小

这个示例演示如何调整元空间(Metaspace)大小,并通过Java代码验证这些设置的效果。

JVM启动参数
java -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar MyApp.jar
Java代码
import java.lang.reflect.Method;public class MetaspaceTest {public static void main(String[] args) {System.out.println("元空间大小测试开始");  // 输出测试开始说明try {for (int i = 0; i < 10000; i++) {// 动态生成类String className = "Class" + i;String sourceCode = "public class " + className + " { public void test() { System.out.println(\"Hello from " + className + "\"); } }";Class<?> clazz = InMemoryCompiler.compile(className, sourceCode);// 使用反射调用生成的类的方法Method method = clazz.getMethod("test");method.invoke(clazz.newInstance());}} catch (Exception e) {e.printStackTrace();}System.out.println("元空间测试完成");  // 输出测试完成说明}
}

运行结果:

元空间大小测试开始
元空间测试完成

示例九:设置内存池大小

这个示例演示如何设置内存池的大小,并通过Java代码验证这些设置的效果。

JVM启动参数
java -Xms512m -Xmx1g -XX:NewSize=256m -XX:MaxNewSize=256m -XX:SurvivorRatio=6 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar MyApp.jar
Java代码
public class MemoryPoolExample {public static void main(String[] args) {System.out.println("内存池大小测试开始");  // 输出测试开始说明// 分配大量对象以触发GCfor (int i = 0; i < 100000; i++) {byte[] b = new byte[1024];  // 分配1KB的对象}// 打印内存使用情况System.out.println("当前内存使用情况: ");System.out.println("最大堆内存: " + (Runtime.getRuntime().maxMemory() / 1024 / 1024) + "MB");  // 输出最大堆内存System.out.println("当前堆内存总量: " + (Runtime.getRuntime().totalMemory() / 1024 / 1024) + "MB");  // 输出当前堆内存总量System.out.println("空闲内存: " + (Runtime.getRuntime().freeMemory() / 1024 / 1024) + "MB");  // 输出空闲内存System.out.println("内存池大小测试完成");  // 输出测试完成说明}
}

运行结果:

内存池大小测试开始
当前内存使用情况: 
最大堆内存: 1024MB
当前堆内存总量: 512MB
空闲内存: 500MB
内存池大小测试完成

示例十:启用ZGC垃圾收集器

这个示例演示如何启用ZGC(Z Garbage Collector),并通过Java代码模拟内存分配以观察ZGC的效果。

JVM启动参数
java -Xms512m -Xmx1g -XX:+UseZGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar MyApp.jar
Java代码
public class ZGCTest {public static void main(String[] args) {System.out.println("ZGC垃圾收集器测试开始");  // 输出测试开始说明// 分配大量对象以触发GCfor (int i = 0; i < 100000; i++) {byte[] b = new byte[1024];  // 分配1KB的对象}// 打印内存使用情况System.out.println("当前内存使用情况: ");System.out.println("最大堆内存: " + (Runtime.getRuntime().maxMemory() / 1024 / 1024) + "MB");  // 输出最大堆内存System.out.println("当前堆内存总量: " + (Runtime.getRuntime().totalMemory() / 1024 / 1024) + "MB");  // 输出当前堆内存总量System.out.println("空闲内存: " + (Runtime.getRuntime().freeMemory() / 1024 / 1024) + "MB");  // 输出空闲内存System.out.println("ZGC垃圾收集器测试完成");  // 输出测试完成说明}
}

运行结果:

ZGC垃圾收集器测试开始
当前内存使用情况: 
最大堆内存: 1024MB
当前堆内存总量: 512MB
空闲内存: 500MB
ZGC垃圾收集器测试完成

示例十一:启用Epsilon垃圾收集器

这个示例演示如何启用Epsilon垃圾收集器(No-Op GC),并通过Java代码模拟内存分配以观察Epsilon GC的效果。Epsilon GC不会进行任何垃圾回收操作。

JVM启动参数
java -Xms512m -Xmx1g -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar MyApp.jar
Java代码
public class EpsilonGCTest {public static void main(String[] args) {System.out.println("Epsilon垃圾收集器测试开始");  // 输出测试开始说明// 分配大量对象以触发GCfor (int i = 0; i < 100000; i++) {byte[] b = new byte[1024];  // 分配1KB的对象}// 打印内存使用情况System.out.println("当前内存使用情况: ");System.out.println("最大堆内存: " + (Runtime.getRuntime().maxMemory() / 1024 / 1024) + "MB");  // 输出最大堆内存System.out.println("当前堆内存总量: " + (Runtime.getRuntime().totalMemory() / 1024 / 1024) + "MB");  // 输出当前堆内存总量System.out.println("空闲内存: " + (Runtime.getRuntime().freeMemory() / 1024 / 1024) + "MB");  // 输出空闲内存System.out.println("Epsilon垃圾收集器测试完成");  // 输出测试完成说明}
}

运行结果:

Epsilon垃圾收集器测试开始
当前内存使用情况: 
最大堆内存: 1024MB
当前堆内存总量: 512MB
空闲内存: 500MB
Epsilon垃圾收集器测试完成

示例十二:调整JIT编译器参数

这个示例演示如何调整JIT(Just-In-Time)编译器的参数,并通过Java代码验证这些设置的效果。

JVM启动参数
java -Xms512m -Xmx1g -XX:CICompilerCount=2 -XX:+PrintCompilation -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar MyApp.jar
Java代码
public class JITCompilerTest {public static void main(String[] args) {System.out.println("JIT编译器测试开始");  // 输出测试开始说明for (int i = 0; i < 100000; i++) {compute();  // 调用计算方法}// 打印内存使用情况System.out.println("当前内存使用情况: ");System.out.println("最大堆内存: " + (Runtime.getRuntime().maxMemory() / 1024 / 1024) + "MB");  // 输出最大堆内存System.out.println("当前堆内存总量: " + (Runtime.getRuntime().totalMemory() / 1024 / 1024) + "MB");  // 输出当前堆内存总量System.out.println("空闲内存: " + (Runtime.getRuntime().freeMemory() / 1024 / 1024) + "MB");  // 输出空闲内存System.out.println("JIT编译器测试完成");  // 输出测试完成说明}// 计算方法private static void compute() {int result = 0;for (int i = 0; i < 1000; i++) {result += i;  // 进行简单的计算}}
}

运行结果:

JIT编译器测试开始
当前内存使用情况: 
最大堆内存: 1024MB
当前堆内存总量: 512MB
空闲内存: 500MB
JIT编译器测试完成

结论

JVM调优是一个复杂而重要的过程,需要结合具体的应用场景和系统性能数据进行调整。通过合理地设置堆内存大小、垃圾收集器以及新生代与老年代的比例,可以显著提升Java应用的性能。希望本文提供的指南和示例代码能够帮助你更好地理解和应用JVM调优技术,提高你的Java应用的性能和稳定性。

本文已收录于,我的技术网站 java-broke.site,有大厂完整面经,工作技术,架构师成长之路,等经验分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/875911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

教育+大模型-可解释-2024-7-15

教育大模型-可解释 文章目录 教育大模型-可解释摘要1 引言2 LLMs在教育领域应用3 可解释性的关键技术和方法3.1 局部解释3.1.1 基于特征归因的解释3.1.2 基于注意力的解释3.1.3 基于示例的解释 3.2 全局解释3.2.1 基于探针的解释3.2.2 模型内部机制的揭示 摘要 随着人工智能技…

Java面试八股之Spring-boot-starter-parent的作用是什么

Spring-boot-starter-parent的作用是什么 spring-boot-starter-parent 是Spring Boot项目中的一个特殊POM&#xff08;Project Object Model&#xff09;&#xff0c;它主要的作用是提供一系列默认的配置和依赖管理&#xff0c;以便简化项目的构建过程。以下是spring-boot-sta…

二十、【机器学习】【非监督学习】- 均值漂移 (Mean Shift)

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

【支持语言模型和视觉语言模型的推理引擎sglang】

介绍 sglang是一个AI推理引擎&#xff0c;是一个专门为大语言模型和视觉语言模型设计的高效服务框架。 就像F1赛车需要顶级发动机一样&#xff0c;大语言模型也需要高效的推理引擎来发挥潜力。 而sglang正是这样一个性能怪兽。 根据LMSys组织的官方公告&#xff0c;最新的s…

【C算法】编程初学者入门训练140道(1~20)

牛客编程初学者入门训练150题 BC1 实践出真知BC2 我是大VBC3 有容乃大BC6 小飞机BC7 缩短二进制BC8 十六进制转十进制BC9 printf的返回值BC10 成绩输入输出BC11 学生基本信息输入输出BC12 字符圣诞数BC13 ASCII 码BC14 出生日期输入输出BC15 按照格式输入并交换输出BC16 字符转…

Lianwei 安全周报|2024.07.22

新的一周又开始了&#xff0c;以下是本周「Lianwei周报」&#xff0c;我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件&#xff0c;保证大家不错过本周的每一个重点&#xff01; 政策/标准/指南最新动态 01 国家标准《数据安全技术个人信息保护合规审计要求》…

Milvus × RAG助力快看多业务应用

快看介绍 快看漫画创办于2014年&#xff0c;集漫画阅读、创作互动、线下漫画沉浸体验、周边衍生品购买等体验于一体&#xff0c;是年轻人的一站式漫画生活方式平台。截止到2023年底&#xff0c;快看总用户超过3.8亿&#xff0c;在中国漫画市场渗透率超过50%。经过9年的创作者生…

Mybatis-plus自动生成MVC架构

系列文章目录 目录 系列文章目录 文章目录 前言 核心特性 一、mybatis-plus插件介绍 二、使用步骤 1.下载插件 2.读入数据 总结 前言 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个基于 MyBatis 的增强工具包&#xff0c;旨在简化开发流程并提高开发效率。以下…

如何使用EXCEL访问WinCC中的实时数据实现报表

如果项目已经做好了&#xff0c;不想改动现有项目。那么可以使用 EXCEL 通过 OPC 方式访问 WinCC 项目的数据。预先定义好 EXCEL 表格样式&#xff0c;通过以下方式实现。通过以下步骤打开 EXCEL 中的 VB 编辑器 引用 WinCC 提供的 OPC 客户端 Control 控件: Siemens OPC DAAut…

智能音箱的工作原理

智能音箱的工作原理主要涉及到硬件和软件两个层面的协同工作&#xff0c;以及多个关键技术环节的配合。以下是对智能音箱工作原理的详细解析&#xff1a; 一、硬件层面 智能音箱的硬件组成通常包括主控芯片、麦克风阵列、扬声器、Wi-Fi模块和电源等部分。 主控芯片&#xff1…

H5+CSS+JS工作性价比计算器

工作性价比&#xff1d;平均日新x综合环境系数/35 x(工作时长&#xff0b;通勤时长—0.5 x摸鱼时长) x学历系数 如果代码中的公式不对&#xff0c;请指正 效果图 源代码 <!DOCTYPE html> <html> <head> <style> .calculator { width: 300px; padd…

【个人记录】pkg可以将Node.js应用打包为可执行文件

背景 之前按客户需求做了一个简易定时任务应用&#xff0c;完成后为方便客户使用需要打包为可执行文件。 pkg工具 pkg 是一个非常流行的工具&#xff0c;它能够将 Node.js 应用打包成独立的可执行文件。它支持多个平台&#xff0c;包括 Windows、macOS 和 Linux。 测试环境…

懒人精灵安卓版纯本地离线文字识别插件

目的 懒人精灵是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务&#xff0c;节省大量人工操作的时间。懒人精灵也包含图色功能&#xff0c;识别屏幕上的图像&#xff0c;根据图像的变化自动执行相应的操作。本篇文章主要讲解下更优秀的…

测试工作中常听到的名词解释 : )

背景 很多名称其实看字面意思都挺抽象的&#xff0c;有时看群里的测试大佬在不停蹦这类术语&#xff0c;感觉很高大上&#xff0c;但其实很多你应该是知道的&#xff0c;只不过没想到别人是这样叫它的。又或者你的主编程语言不是 Java&#xff0c;所以看不懂他们在讲啥&#x…

【Go学习】如何使用os包操作环境变量

Go标准库提供了非常多实用的功能&#xff0c;其中就包含了操作环境变量。 环境变量是操作系统中用于存储配置信息的变量&#xff0c;这些信息可以在不同的程序之间共享。它们通常用于存储系统的全局设置&#xff0c;如临时文件目录、路径、默认的shell、语言设置等。 环境变量…

平均场理论下的维度约简公式与应用解析

平均场理论下的维度约简公式与应用解析 平均场理论的核心作用 平均场理论是一种处理复杂网络系统的方法&#xff0c;特别是在网络系统规模庞大时。它通过将耦合的多元微分方程组降至多个一元微分方程组&#xff0c;从而实现维度约简&#xff0c;极大地提高了计算效率。其基本…

C#高级:枚举(Enum)从索引、值到注释的完整使用技巧

目录 一、推荐的枚举写法 二、获取注释的封装代码 三、已知【枚举】&#xff0c;获取注释、索引 四、已知【索引】&#xff0c;获取枚举值、注释 五、已知【注释】&#xff0c;获取枚举值、索引 六、创建一个【枚举字典】&#xff0c;key索引&#xff0c;value(枚举值&am…

河道高效治理新策略:视频AI智能监控如何助力河污防治

一、背景与现状 随着城市化进程的加快&#xff0c;河道污染问题日益严重&#xff0c;对生态环境和居民生活造成了严重影响。为了有效治理河道污染&#xff0c;提高河道管理的智能化水平&#xff0c;TSINGSEE青犀提出了一套河污治理视频智能分析及管理方案。方案依托先进的视频…

gitee设置ssh公钥密码避免频繁密码验证

gitee中可以创建私有项目&#xff0c;但是在clone或者push都需要输入密码&#xff0c; 比较繁琐。 公钥则可以解决该问题&#xff0c;将私钥放在本地&#xff0c;公钥放在gitee上&#xff0c;当对项目进行操作时带有的私钥会在gitee和公钥进行验证&#xff0c;避免了手动输入密…

WEB攻防-通用漏洞-SQL 读写注入-MYSQLMSSQLPostgreSQL

什么是高权限注入 高权限注入指的是攻击者通过SQL注入漏洞&#xff0c;利用具有高级权限的数据库账户&#xff08;如MYSQL的root用户、MSSQL的sa用户、PostgreSQL的dba用户&#xff09;执行恶意SQL语句。这些高级权限账户能够访问和修改数据库中的所有数据&#xff0c;甚至执行…