怎么做网站文章/竞价是什么工作
🥰🥰🥰来都来了,不妨点个关注叭!
👉博客主页:欢迎各位大佬!👈
文章目录
- 1. 前置回顾
- 2. 动态线程池
- 2.1 JMX 的介绍
- 2.1.1 MBeans 介绍
- 2.2 使用 JMX + jconsole 实现动态修改线程池
- 2.2.1 介绍 ManagementFactory
- 2.2.2 JMX 与 ManagementFactory 的区别与联系
回顾这期内容:【多线程】线程池,介绍了线程池,其中 5.3 介绍如何给线程池设置合适线程数量(这期内容会再回顾一遍),这期内容,具体讨论一下,线程池核心数到底如何配置~
1. 前置回顾
在实际开发中如何给线程池设置合适的线程数量呢?
我们要知道,线程不是越多越好,线程的本质上是要在 CPU 上调度的,一个线程池的线程数量设置为多少合适,这需要结合实际情况实际任务决定,一般分为 CPU 密集型和 IO 密集型,通常是如下配置:
- CPU 密集型任务:N+1,主要做一些计算工作,要在 CPU上运行
- IO 密集型任务:2N+1,主要是等待 IO 操作,比如等待读写硬盘,读写网卡等,不怎么消耗 CPU 资源
(其中 N 为 CPU 的核心数量)
Q:为什么要加 1
A:+1 个线程是为了在某个线程因为一些原因,比如缓存未命中、遇到短暂的指令停顿等,暂时阻塞时,能有一个额外的线程可以在 CPU 上运行,从而充分利用 CPU 的空闲时间,避免 CPU 核心出现空闲等待的情况,提高整体的 CPU 利用率,应对一些特殊情况或系统开销等,确保即使在某些线程出现意外阻塞等情况时,系统仍能有额外的线程来维持一定的处理能力,保证系统的稳定性和性能
极端情况下,如果线程全是使用 CPU 运行,线程数就不应该超过 CPU 核心数(逻辑核心,比如一个电脑是6核12线程,即12个逻辑核心,以12为基准),如果线程全是使用的 IO,则线程数可以设置很多,远远超出 CPU 的核心数
在实际开发中,很少有这么极端的情况,就是以实际情况来设定,需要具体通过测试的方式来确定,测试方式的大体思路是,运行程序,通过记录时间戳计算一下执行时间,同时监测资源的使用状态,线程数量取一个执行效率可以并且占用资源也还可以的数量~
这里的两个关键点:
- 记录时间戳计算执行时间
- 监测资源的使用状态
计算执行时间的具体操作方法是,可以统计一个完整的请求中,耗费 CPU 计算的过程占用了多少时间,等待的过程,如读取缓存、读取 DB 等占用了多少时间,假设统计结果是 100ms 用来做 CPU 计算,900ms 都是 IO 相关的操作,不占 CPU 时间,那么就可以通过 (100+900) / 100 的计算公式,得出对于单核 CPU,设置线程数为 10 就可以把 CPU 跑满,同理,如果是 6 核 CPU,那么就设置线程数为 60
监测资源的使用状态具体操作方法,在程序执行过程中,持续监测 CPU、内存、线程等资源的使用情况
具体代码如下:
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.lang.management.ThreadMXBean;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ResourceMonitoringExample {// 这里进行模拟任务static class Task implements Runnable {@Overridepublic void run() {try {// 模拟耗时操作Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {int threadCount = 10; // 初始线程数量ExecutorService executor = Executors.newFixedThreadPool(threadCount);// 记录开始时间long startTime = System.currentTimeMillis();// 提交任务for (int i = 0; i < 20; i++) {executor.submit(new Task());}// 关闭线程池executor.shutdown();while (!executor.isTerminated()) {// 监测资源使用状态monitorResources();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}// 记录结束时间long endTime = System.currentTimeMillis();long executionTime = endTime - startTime;System.out.printf("程序执行时间: %d 毫秒%n", executionTime);}// 监测资源使用状态private static void monitorResources() {// 监测 CPU 使用情况OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();if (osBean instanceof com.sun.management.OperatingSystemMXBean) {com.sun.management.OperatingSystemMXBean sunOsBean = (com.sun.management.OperatingSystemMXBean) osBean;double cpuLoad = sunOsBean.getSystemCpuLoad();if (cpuLoad >= 0) {System.out.printf("当前系统 CPU 使用率: %.2f%%%n", cpuLoad * 100);}}// 监测线程数量ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();int threadCount = threadBean.getThreadCount();System.out.printf("当前活动线程数量: %d%n", threadCount);}
}
其中:ManagementFactory 是 Java 中的一个实用工具类,位于 java.lang.management
包下,该类提供了一系列静态方法,用于获取 JVM 的各种管理接口实例,这些管理接口允许你监控和管理 JVM 的运行时状态、系统资源使用情况等(后文会详细介绍)~
总结:
线程池的核心参数并不是这么冰冷冷且固定的数字,还是需要结合实际场景考虑,一般线程池核心数,可以根据实际情况进行计算后配置~
下面介绍动态线程池,我们一起来看看~
2. 动态线程池
线程池线程数的设置是个难题,线程池核心数到底如何配置?最好的办法是能够动态调整线程池线程数,并能够看到调整后的效果,也就是线程利用率,有一个工具能够实现这样的效果 —— 使用 JMX
那么 JMX 是什么呢? 我们先来一起了解一下!
2.1 JMX 的介绍
- JMX 是什么:JMX(Java Management Extensions)是 Java 平台的一部分,它提供了一种管理和监控 Java 应用程序的标准方法,即是一个为应用程序、设备、系统等植入管理功能的框架,JMX 允许监控和管理系统资源、应用程序和服务,以及获取关于这些实体的运行时信息,简单来说,就是通过 JMX 可以动态查看对象的运行信息,并且可以动态修改对象属性~
- JMX 的架构:如下图
分析这张图我们可以发现,JMX 底层是由很多不同的 MBeans 组成的,即 MBeans 是 JMX 的核心
2.1.1 MBeans 介绍
MBeans 是什么:它们是实现了特定接口的 Java 对象,用于表示可以被监控和管理的资源
MBeans 的类型:可以分为四种不同的类型
- Standard MBeans
- Dynamic MBeans
- Open MBeans
- Model MBeans
MBeans 的作用:这些 MBeans 的作用就是获取对象的信息,或是修改对象信息,都是通过 MBeans 来完成的
MBeans 的用法:所有的 MBeans 都需要注册到 MBeanServer 上,然后再通过一些外部工具如 JMX、Web 浏览器等,就可以去获取或者修改 MBeans 的信息了
补充:
Q:那 MBean Server 是什么呢?
A:这里的 MBean Server 是一个代理,它提供一个注册、检索和操作 MBeans 的 API,它是 JMX 架构中的核心组件,负责管理所有 MBeans 的生命周期
接下来,我们一起来看看如何使用 JMX 诗仙女动态修改线程池
2.2 使用 JMX + jconsole 实现动态修改线程池
1)自定义一个动态线程池
首先,我们先来自定义一个动态线程池,如下:
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** Created with IntelliJ IDEA.* Description:* User: 26727* Date: 2025-02-05* Time: 18:41*/
public class DynamicThreadPool {private ThreadPoolExecutor threadPoolExecutor;public DynamicThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);}public ThreadPoolExecutor getThreadPoolExecutor() {return threadPoolExecutor;}public void setCorePoolSize(int corePoolSize) {threadPoolExecutor.setCorePoolSize(corePoolSize);}public void setMaximumPoolSize(int maximumPoolSize) {threadPoolExecutor.setMaximumPoolSize(maximumPoolSize);}
}
动态线程池的相关参数如下,动态线程池其实就是传统的线程传统的线程池对象 ThreadPoolExecutor 封装了一下,并且提供了两个方法 setCorePoolSize 和 setMaximumPoolSize,这样通过这两个方法,我们就可以动态设置线程池的线程数了~
2)自定义一个 MBean 接口
接下来,我们自定义一个 MBean 这个接口中提供四个方法,分别用来获取或者设置线程数的信息
public interface DynamicThreadPoolMXBean {int getCorePoolSize();void setCorePoolSize(int corePoolSize);int getMaximumPoolSize();void setMaximumPoolSize(int maximumPoolSize);
}
3)自定义类实现 DynamicThreadPoolMXBean 接口
接着,我们自定义类实现 DynamicThreadPoolMXBean 接口,并继承 StandardMBean 类,如下:
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.StandardMBean;
import java.lang.management.ManagementFactory;/*** Created with IntelliJ IDEA.* Description:* User: 26727* Date: 2025-02-04* Time: 23:02*/
public class DynamicThreadPoolMBean extends StandardMBean implements DynamicThreadPoolMXBean {private DynamicThreadPool dynamicThreadPool;public DynamicThreadPoolMBean(DynamicThreadPool dynamicThreadPool) throws Exception {super(DynamicThreadPoolMXBean.class);this.dynamicThreadPool = dynamicThreadPool;registerMBean();}private void registerMBean() {try {MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();ObjectName name = new ObjectName("org.javaboy:type=DynamicThreadPool");mbs.registerMBean(this, name);} catch (Exception e) {e.printStackTrace();}}@Overridepublic int getCorePoolSize() {return dynamicThreadPool.getThreadPoolExecutor().getCorePoolSize();}@Overridepublic void setCorePoolSize(int corePoolSize) {dynamicThreadPool.setCorePoolSize(corePoolSize);}@Overridepublic int getMaximumPoolSize() {return dynamicThreadPool.getThreadPoolExecutor().getMaximumPoolSize();}@Overridepublic void setMaximumPoolSize(int maximumPoolSize) {dynamicThreadPool.setMaximumPoolSize(maximumPoolSize);}
}
【解析】
-
构造函数接受一个 DynamicThreadPool 类型的参数,用于初始化 dynamicThreadPool 的成员变量
super(DynamicThreadPoolMXBean.class)
调用父类 StandardMBean 的构造函数,传入 DynamicThreadPoolMXBean 类的 Class 对象,用于指定 MBean 的管理接口,调用 registerMBean() 方法将该 MBean 注册到 JMX 平台 MBean 服务器中,即在构造器中,调用了 registerMBean() 方法,这个方法用来将当前对象注册到 MBeanServer 上~ -
注册 MBean 方法
registerMBean()
,ManagementFactory.getPlatformMBeanServer()
获取平台 MBean 服务器的实例,ObjectName 用于唯一标识 MBean,这里使用org.javaboy:type=DynamicThreadPool
作为 MBean 的名称,
mbs.registerMBean(this, name)
将当前 DynamicThreadPoolMBean 实例注册到 MBean 服务器中
4)执行代码
最后,就可以启动自己的这段代码了~
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;/*** Created with IntelliJ IDEA.* Description:* User: 26727* Date: 2025-02-04* Time: 23:07*/
public class Main {public static void main(String[] args) throws Exception {DynamicThreadPool dynamicThreadPool = new DynamicThreadPool(2, 6, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10));DynamicThreadPoolMBean mBean = new DynamicThreadPoolMBean(dynamicThreadPool);while (true) {System.out.println("CorePoolSize:"+dynamicThreadPool.getThreadPoolExecutor().getCorePoolSize());System.out.println("MaximumPoolSize:"+dynamicThreadPool.getThreadPoolExecutor().getMaximumPoolSize());try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}
}
为了看到线程池的线程数量,这里使用了一个死循环一直打印线程数量信息,这样一会通过 jconsole 修改线程池信息的时候,就能看到修改的效果了~
程序启动之后,使用 jconsole 连接上当前应用程序,如下图:
(jconsole 使用忘记的小伙伴可回顾往期内容:【多线程】如何使用jconsole工具查看Java线程的详细信息?)
点击 Main 进入连接
点击 MBean 这个选项卡位置,可以看到刚刚配置的 MBean,右侧的值则可以点击直接修改,修改之后,回到应用程序控制台,可以发现线程相关数据已经发生变化了,实现了动态修改的效果~
可以看到,控制台信息已经发生变化,如下:
这样就可以动态修改了!
2.2.1 介绍 ManagementFactory
可以看到上面使用了 ManagementFactory 类,下面具体介绍其用法:
1) 获取线程管理接口实例 —— getThreadMXBean()
返回一个 ThreadMXBean 实例,用于监控和管理 Java 虚拟机中的线程,通过该接口,可以获取线程的各种信息,如线程的状态、CPU 时间、阻塞时间等
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;public class ThreadMonitoringExample {public static void main(String[] args) {// 获取 ThreadMXBean 实例ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();// 获取所有线程的 IDlong[] threadIds = threadMXBean.getAllThreadIds();for (long threadId : threadIds) {// 获取线程信息System.out.println("Thread ID: " + threadId + ", Thread Name: " + threadMXBean.getThreadInfo(threadId).getThreadName());}}
}
2)获取内存管理接口实例 —— getMemoryMXBean()
返回一个 MemoryMXBean 实例,用于监控和管理 Java 虚拟机的内存使用情况。通过该接口,可以获取堆内存和非堆内存的使用情况,还可以触发垃圾回收操作~
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;public class MemoryMonitoringExample {public static void main(String[] args) {// 获取 MemoryMXBean 实例MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();// 获取堆内存使用情况MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();System.out.println("Heap Memory Usage: " + heapMemoryUsage);// 获取非堆内存使用情况MemoryUsage nonHeapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage();System.out.println("Non-Heap Memory Usage: " + nonHeapMemoryUsage);}
}
3)获取运行时管理接口实例 —— getRuntimeMXBean()
返回一个 RuntimeMXBean 实例,用于获取 Java 虚拟机的运行时信息,如 JVM 的启动时间、系统属性、命令行参数等
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;public class RuntimeInfoExample {public static void main(String[] args) {// 获取 RuntimeMXBean 实例RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();// 获取 JVM 启动时间long startTime = runtimeMXBean.getStartTime();System.out.println("JVM Start Time: " + startTime);// 获取系统属性System.out.println("System Properties: " + runtimeMXBean.getSystemProperties());}
}
ManagementFactory 类为 Java 开发者提供了便捷的方式来监控和管理 JVM 的运行时状态,通过获取不同的管理接口实例,可以深入了解 JVM 的内部运行情况,从而进行性能调优、故障排查等相关工作~
2.2.2 JMX 与 ManagementFactory 的区别与联系
区别:
JMX —— Java 扩展管理,是一个为应用程序、设备、系统等植入管理功能的框架
ManagementFactory —— Java 标准库中用于辅助使用 JMX 功能的实用工具类
联系:
- ManagementFactory 是 JMX 功能使用的便捷入口
JMX 架构复杂:JMX 定义了一套完整的架构,包括 MBean、MBeanServer等核心组件,使用 JMX 进行管理和监控时,需要涉及多个步骤和类的使用,整体较为复杂,而 ManagementFactory 简化操作,ManagementFactory 类提供了一系列静态方法,通过调用这些方法可以方便地获取各种 JMX 管理接口的实例。如,ManagementFactory.getThreadMXBean() 方法返回的 ThreadMXBean 是一个 JMX 的 MXBean,它允许开发者监控和管理 Java 虚拟机中的线程。这些方法隐藏了底层 JMX 架构的复杂性,使得开发者可以更轻松地使用 JMX 功能~ - ManagementFactory 实例基于 JMX 标准
ManagementFactory 所返回的各种管理接口实例(如 MemoryMXBean、RuntimeMXBean 等)都是遵循 JMX 规范的 MXBean,这些 MXBean 定义了一组标准的管理操作和属性,可以通过 JMX 代理进行访问和管理,并且可集成到 JMX 系统,通过 ManagementFactory 获取的管理接口实例可以无缝集成到 JMX 系统中。开发者可以将这些 MXBean 注册到 MBeanServer 上,然后使用 JMX 客户端远程或本地监控和管理 Java 应用程序~ - ManagementFactory 服务于 JMX 监控和管理目的
支持监控:JMX 的主要目的之一是对 Java 应用程序进行监控和管理,ManagementFactory 所提供的各种管理接口实例可以提供丰富的监控数据,例如,MemoryMXBean 可以提供 Java 虚拟机的内存使用情况,包括堆内存和非堆内存的使用量、峰值等信息;并且ThreadMXBean 可以提供线程的状态、CPU 时间等信息。
支持管理:除了监控数据,ManagementFactory 所提供的管理接口实例还支持一些管理操作,例如,MemoryMXBean 可以触发垃圾回收操作,ThreadMXBean 可以获取线程的堆栈跟踪信息等,这些操作可以帮助开发者对 Java 应用程序进行动态管理和故障排查~
💛💛💛本期内容回顾💛💛💛
✨✨✨本期内容到此结束啦~
相关文章:

【多线程】线程池核心数到底如何配置?
🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 前置回顾2. 动态线程池2.1 JMX 的介绍2.1.1 MBeans 介绍 2.2 使用 JMX jconsole 实现动态修改线程池2.2.…...

Windows图形界面(GUI)-QT-C/C++ - Qt Combo Box
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 一、概述 1.1 基本概念 1.2 应用场景对比 二、核心属性详解 2.1 行为控制 2.2 显示配置 三、数据操作与访问 3.1 基础数据管理 3.2 高级数据访问 四、用户交互处理 4.1 信号处…...

开源AI智能名片2 + 1链动模式S2B2C商城小程序:内容价值创造与传播新引擎
摘要:本文聚焦于信息爆炸时代下,内容价值的创造与传播。随着用户角色的转变,其在内容生产与传播中的价值日益凸显。同时,深入探讨开源AI智能名片2 1链动模式S2B2C商城小程序这一创新商业模式,如何借助用户创造内容并传…...

python读取excel工具:openpyxl | AI应用开发
python读取excel工具:openpyxl | AI应用开发 openpyxl 是一个 Python 库,专门用于读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件。它是处理 Excel 文件的强大工具,可以让你在不需要安装 Excel 软件的情况下,对 Excel 文件进行创建、…...

堆的基本概念
1.1 堆的基本概念 虚拟机所在目录 E:\ctf\pwn-self 进入虚拟机的pwndocker环境 holyeyesubuntu:~$ pwd /home/holyeyes holyeyesubuntu:~$ sudo ./1run.sh IDA分析 int __fastcall main(int argc, const char **argv, const char **envp) { void *v4; // [rsp20h] [rbp-1…...

Android车机DIY开发之软件篇(九) NXP AutomotiveOS编译
Android车机DIY开发之软件篇(十一) NXP AutomotiveOS编译 Google 在汽车上也提供了用于汽车的 Google 汽车服务(GAS,Google Automotive Service),包含有 Google 地图、应用市场、Google 汽车助理等等。Google 汽车服务同样没有开…...

嵌入式工程师必学(143):模拟信号链基础
概述: 我们每天使用的许多电子设备,以及我们赖以生存的电子设备,如果不使用电子工程师设计的实际输入信号,就无法运行。 模拟信号链由四个主要元件组成:传感器、放大器、滤波器和模数转换器 (ADC)。这些传感器用于检测、调节模拟信号并将其转换为适合由微控制器或其他数…...

《LLM大语言模型深度探索与实践:构建智能应用的新范式,融合代理与数据库的高级整合》
文章目录 Langchain的定义Langchain的组成三个核心组件实现整个核心组成部分 为什么要使用LangchainLangchain的底层原理Langchain实战操作LangSmithLangChain调用LLM安装openAI库-国内镜像源代码运行结果小结 使用Langchain的提示模板部署Langchain程序安装langserve代码请求格…...

e2studio开发RA2E1(5)----GPIO输入检测
e2studio开发RA2E1.5--GPIO输入检测 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置GPIO口配置按键口配置按键口&Led配置R_IOPORT_PortRead()函数原型R_IOPORT_PinRead()函数原型代码 概述 本篇文章主要介绍如何…...

Spring @Lazy:延迟初始化,为应用减负
在Spring框架中,Lazy注解的作用非常直观,它就是用来告诉Spring容器:“嘿,这个Bean嘛,先别急着创建和初始化,等到真正需要用到的时候再弄吧!” 默认情况下,Spring容器在启动时会立即创…...

将OneDrive上的文件定期备份到移动硬盘
背景: 我在oneDrive上存了很多文件,分布在多个文件夹中,也有套了好几层文件夹的情况。我希望每隔一段时间,将oneDrive上的所有文件向移动硬盘上拷贝一份,但是我只想将距离上一次向移动硬盘拷贝的文件相比,发…...

从0开始,来看看怎么去linux排查Java程序故障
一,前提准备 最基本前提:你需要有liunx环境,如果没有请参考其它文献在自己得到local建立一个虚拟机去进行测试。 有了虚拟机之后,你还需要安装jdk和配置环境变量 1. 安装JDK(以OpenJDK 17为例) 下载JDK…...

DeepSeek-V3:开源多模态大模型的突破与未来
目录 引言 一、DeepSeek-V3 的概述 1.1 什么是 DeepSeek-V3? 1.2 DeepSeek-V3 的定位 二、DeepSeek-V3 的核心特性 2.1 多模态能力 2.2 开源与可扩展性 2.3 高性能与高效训练 2.4 多语言支持 2.5 安全与伦理 三、DeepSeek-V3 的技术架构 3.1 模型架构 3…...

Deep Sleep 96小时:一场没有硝烟的科技保卫战
2025年1月28日凌晨3点,当大多数人还沉浸在梦乡时,一场没有硝烟的战争悄然打响。代号“Deep Sleep”的服务器突遭海量数据洪流冲击,警报声响彻机房,一场针对中国关键信息基础设施的网络攻击来势汹汹! 面对美国发起的这场…...

Redis地理散列GeoHash
GeoHash是一种用于地理位置编码的算法,将二维的地理坐标(纬度和经度)转换为一维的字符串表示,从而实现对地理位置的高效存储和查询。Redis作为一个内存数据库,提供了对GeoHash的支持,使得地理位置相关的数据…...

JAVA安全—反射机制攻击链类对象成员变量方法构造方法
前言 还是JAVA安全,哎,真的讲不完,太多啦。 今天主要是讲一下JAVA中的反射机制,因为反序列化的利用基本都是要用到这个反射机制,还有一些攻击链条的构造,也会用到,所以就讲一下。 什么是反射…...

专业学习|一文了解并实操自适应大邻域搜索(讲解代码)
一、自适应大邻域搜索概念介绍 自适应大邻域搜索(Adaptive Large Neighborhood Search,ALNS)是一种用于解决组合优化问题的元启发式算法。以下是关于它的详细介绍: -自适应大领域搜索的核心思想是:破坏解、修复解、动…...

9. k8s二进制集群之kube-controller-manager部署
同样在部署主机上创建证书请求文件(为之后的证书生成做准备)根据上面的证书文件创建证书(结果会在当前目录下产生kube-controller-manager证书)创建kube-controller-manager服务配置文件创建kube-controller-manager服务启动文件同步kube-controller-manager证书到对应mast…...

轮转数组-三次逆置
题目 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 void rotate(int* nums, int numsSize, int k){}示例: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] …...

3 卷积神经网络CNN
1 Image Classification (Neuron Version) – 1.1 Observation 1 1.2 Observation 2 如果不同的receptive field需要相同功能的neuron,可以使这些neuron共享参数 1.3 Benefit of Convolutional Layer 2 Image Classification (Filter Version) 不用担心filter大小…...

穷举vs暴搜vs深搜vs回溯vs剪枝系列一>黄金矿工
目录 决策树:代码设计代码: 决策树: 代码设计 代码: class Solution {boolean[][] vis;int ret,m,n;public int getMaximumGold(int[][] grid) {m grid.length;n grid[0].length;vis new boolean[m][n]; for(int i 0; i <…...

java基础1(黑马)
一、初识Java 1.Java背景知识 1)Java是美国SUN公司在1995年推出的一门计算机高级编程语言。 2)Java早期名称为OAK,后来才改为Java。 3)Java之父:詹姆斯高斯林。 4)2009年,SUN公司被Oracle公…...

ES6 对象扩展:对象简写,对象属性 表达式,扩展运算符 ...,Object.assign,Object.is,用法和应用场景
1. 对象属性简写 1.1 基本语法 // 传统写法 const name John; const age 25; const user {name: name,age: age };// ES6 简写语法 const user {name,age };1.2 实际应用场景 // 1. 函数返回对象 function createUser(name, age, email) {return {name,age,email}; }// …...

2025 持续防范 GitHub 投毒,通过 Sharp4SuoExplorer 分析 Visual Studio 隐藏文件
在2024年底的网络安全事件中,某提权工具被发现植入后门,攻击者利用 .suo 文件作为隐蔽的攻击方式。由于 .suo 文件是 Visual Studio 项目的隐藏配置文件,通常不为安全研究人员所关注,因此为攻击者提供了潜在的攻击渠道。 初步调查…...

PCB走线宽度与过流能力参考
我们PCB走线,线宽与允许通过电流的大小是什么样的?几个因素 1、允许的温升:如果能够允许的铜线升高的温度越高,那么允许通过的电流自然也就越高 2、走线的线宽:线越宽 ,导线横截面积越大,电阻…...

电商项目-分布式事务(四)基于消息队列实现分布式事务
基于消息队列实现分布式事务,实现消息最终一致性 如何基于消息队列实现分布式事务? 通过消息队列实现分布式事务的话,可以保证当前数据的最终一致性。实现思路:将大的分布式事务,进行拆分,拆分成若干个小…...

g++ -> make -> cmake(草稿)
1 Windows上安装mingw 2 构建一个 c 项目 3 g 编译 4 make 编译 5 cmake 编译...

JSON常用的工具方法
前言: 在日常开发中,JSON 数据的处理是常见的需求。无论是数据转换、格式化还是与其他格式的互转,掌握一些常用的工具方法可以大大提高开发效率。本文将介绍一些实用的 JSON 操作方法,帮助你快速上手。 JSON常用的工具方法 1.json字符串转换…...

【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信
Kubernetes中Pod间的通信 本系列文章共3篇: 【Kubernetes Pod间通信-第1篇】在单个子网中使用underlay网络实现Pod到Pod的通信【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信(本文介绍)【Kubernetes Pod间通信-第3篇】Kubernetes中Pod与ClusterIP服务之间的通信…...

[权限提升] Windows 提权 维持 — 系统错误配置提权 - Trusted Service Paths 提权
关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:Trusted Service Paths 提权原理 Windows 的服务通常都是以 System 权限运行的,所以系统在解析服务的可执行文件路径中的空格的时候也会以 System 权限进行解析&a…...