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

Java-JMX 组件架构即详解

        JMX架构由三个主要组件构成:

  • ‌MBeans(Managed Beans)‌:代表可管理的资源,是JMX的核心。MBean可以是Java类或接口,提供了管理操作的接口,如获取系统信息、设置参数等。
  • ‌MBeanServer‌:运行MBeans并处理管理操作的实体。每个Java虚拟机(JVM)都默认包含一个MBeanServer,它可以注册和管理MBeans,并提供了一组API来注册、查询、调用MBean的方法以及接收MBean的通知。
  • ‌代理(Agents)‌:用于暴露MBeanServer给网络中的其他管理工具或系统。JMX代理是一个独立的Java程序,负责加载和管理MBean。

MBean

  • MBean 是JMX中的一个标准概念,它代表了一个可以被管理的资源。
  • MBean 必须遵循特定的接口规范,比如它必须实现一个特定的接口或者继承自 javax.management.DynamicMBean
  • MBean 可以是标准的(Standard MBean)、动态的(Dynamic MBean)、开放式的(Open MBean)或者模型式的(Model MBean)。
  • MBean 的方法名称和签名必须与它们公开的属性和操作完全匹配。

MBean 分类

 JMX标准中将MBean分为以下几种:

  • Standard MBean(标准 MBean):它是最简单的一种 MBean 类型。一个标准 MBean 由一个 Java 接口和一个对应的实现类组成。接口中定义了 MBean 的属性和操作,实现类则提供了对应的实现。标准 MBean 的命名约定为 YourInterfaceNameMBean。
  • Dynamic MBean(动态 MBean):与标准 MBean 不同,动态 MBean 可以在运行时动态地确定其属性和操作。动态 MBean 的属性和操作是在运行时通过方法调用来确定的,因此可以根据需要进行动态修改。
  • Model MBean(模型 MBean):模型 MBean 是一种特殊的 MBean,它通过描述符来描述其管理接口,可以在运行时动态地配置其属性和操作。模型 MBean 可以通过 XML 或者通过程序动态地加载描述符。

  • Open MBean:开放 MBean 是一种通用的 MBean 类型,它可以包含各种类型的属性和操作。开放 MBean 不限制其属性和操作的类型,因此可以包含任意类型的数据。
  • MXBean:MXBean 是一种专门用于 JMX 的 MBean 类型。它定义了一种简单的 Java 接口和实现约定,用于描述 MBean 的属性和操作,同时这些接口和实现类遵循 Java Bean 的命名约定。MXBean 在 JMX 中用于管理特定类型的对象,例如内存使用情况、线程信息等。

 Standard MBean

        Standard MBean按照JMX的命名规范来定义接口然后注册到MBean Server中,MBean就能被JMX的client端访问到。

public interface HelloMBean {String getName();void setName(String name);void sayHello();
}public class Hello implements HelloMBean {private String name;
​@Overridepublic String getName() {return name;}
​@Overridepublic void setName(String name) {this.name = name;}
​@Overridepublic void sayHello() {System.out.println("Hello, " + name + "!");}
}
​public class Main {public static void main(String[] args) throws Exception {// 创建标准 MBean 实例HelloMBean helloMBean = new Hello();// 创建 MBeanServerMBeanServer mbs = ManagementFactory.getPlatformMBeanServer();// 创建 ObjectName,用于标识 MBeanObjectName name = new ObjectName("com.example:type=Hello");// 注册 MBean 到 MBeanServermbs.registerMBean(helloMBean, name);// 等待一段时间,使得可以通过 JConsole 或者其他 JMX 客户端来操作 MBeanThread.sleep(Long.MAX_VALUE);}
}
Spring boot 实现方式

1. 引入依赖

<!-- Spring Boot Actuator 依赖,它包含了 JMX 的支持 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2. yml 配置

spring:jmx:enabled: true

3. 注解实现Mbean 类

@Component
@ManagedResource(objectName = "bean:name=myBeanTest", description = "My Managed Bean")
public class MbeanTest {private String name;@ManagedAttribute(description = "The Name")public String getName() {return name;}@ManagedAttribute(description = "The Name")public void setName(String name) {this.name = name;}@ManagedOperation(description = "Say Hello")public String sayHello() {return "Hello, " + name;}
}

Dynamic MBean

        动态 MBean 的核心是实现 DynamicMBean 接口,该接口定义了一组方法,用于动态地获取和设置 MBean 的属性,执行 MBean 的操作,以及获取 MBean 的元数据信息。以下是 DynamicMBean 接口的几个核心方法:

  • getAttribute(String attribute):根据属性名获取属性值。
  • setAttribute(Attribute attribute):设置指定属性的值。
  • getAttributes(String[] attributes):批量获取属性值。
  • setAttributes(AttributeList attributes):批量设置属性值。
  • invoke(String actionName, Object[] params, String[] signature):执行指定的操作。
  • getMBeanInfo():获取 MBean 的元数据信息,包括属性、操作和描述信息。
@Component
@ManagedResource(objectName = "bean:name=DynamicMBeanTest", description = "My Dynamic Bean")
public class DynamicMBeanTest implements DynamicMBean {private String name;@Overridepublic Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException {if (attribute.equals("Name")) {return name;} else {throw new AttributeNotFoundException("Attribute '" + attribute + "' not found");}}@Overridepublic void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException {if (attribute.getName().equals("Name")) {name = (String) attribute.getValue();} else {throw new AttributeNotFoundException("Attribute '" + attribute.getName() + "' not found");}}@Overridepublic AttributeList getAttributes(String[] attributes) {AttributeList attrs = new AttributeList();for (String attr : attributes) {try {Object value = getAttribute(attr);attrs.add(new Attribute(attr, value));} catch (Exception e) {// Ignore if attribute not found}}return attrs;}@Overridepublic AttributeList setAttributes(AttributeList attributes) {AttributeList responseAttrs = new AttributeList();for (Attribute attr : attributes.asList()) {try {setAttribute(attr);responseAttrs.add(new Attribute(attr.getName(), getAttribute(attr.getName())));} catch (Exception e) {// Ignore if attribute not found or set failed}}return responseAttrs;}@Overridepublic Object invoke(String actionName, Object[] params, String[] signature) throws MBeanException, ReflectionException {if (actionName.equals("sayHello")) {return "Hello, " + name + "!";} else {throw new UnsupportedOperationException("Operation '" + actionName + "' not supported");}}@Overridepublic MBeanInfo getMBeanInfo() {MBeanAttributeInfo[] attributes = new MBeanAttributeInfo[]{new MBeanAttributeInfo("Name", "java.lang.String", "Name of the person", true, true, false)};MBeanOperationInfo[] operations = new MBeanOperationInfo[]{new MBeanOperationInfo("sayHello", "Say hello to the person", null, "java.lang.String", MBeanOperationInfo.ACTION)};return new MBeanInfo(this.getClass().getName(), "Dynamic Hello MBean", attributes, null, operations, null);}
}

Model MBean

        Model MBean 的核心是实现 ModelMBean 接口,该接口继承自 DynamicMBean 接口,因此具有动态 MBean 的所有特性,同时还添加了一些额外的方法用于管理描述符。

  • setModelMBeanInfo(ModelMBeanInfo mbi):设置 Model MBean 的元数据信息,包括属性、操作和描述符。
  • setManagedResource(Object mr, String mr_type):指定 Model MBean 管理的资源对象及其类型。
public class ModelMBeanTest {private static ModelMBeanInfo createModelMBeanInfo() throws Exception {// 创建属性描述符Descriptor nameDesc = new DescriptorSupport();nameDesc.setField("name", "Name");nameDesc.setField("descriptorType", "attribute");// 创建操作描述符Descriptor sayHelloDesc = new DescriptorSupport();sayHelloDesc.setField("name", "sayHello");sayHelloDesc.setField("descriptorType", "operation");// 创建属性列表ModelMBeanAttributeInfo[] attributes = new ModelMBeanAttributeInfo[]{new ModelMBeanAttributeInfo("Name", "java.lang.String", "Name of the person", true, true, false, nameDesc)};// 创建操作列表ModelMBeanOperationInfo[] operations = new ModelMBeanOperationInfo[]{new ModelMBeanOperationInfo("sayHello", "Say hello to the person", null, "java.lang.String", MBeanOperationInfo.ACTION, sayHelloDesc)};// 创建 ModelMBeanInfoModelMBeanInfo modelMBeanInfo = new ModelMBeanInfoSupport(ModelMBeanTest.class.getName(),"Simple Model MBean Example",attributes,null,operations,null);return modelMBeanInfo;}private static ModelMBean createModelMBean(ModelMBeanInfo modelMBeanInfo) throws Exception {// 创建 ModelMBean 实例RequiredModelMBean modelMBean = new RequiredModelMBean();modelMBean.setModelMBeanInfo(modelMBeanInfo);// 创建 MBean 实例ObjectName name = new ObjectName("com.example:type=SimpleModelMBean");ModelMBeanTest example = new ModelMBeanTest();// 设置 MBean 实例modelMBean.setManagedResource(example, "ObjectReference");return modelMBean;}public static void main(String[] args) throws Exception {// 创建 ModelMBeanInfo 对象ModelMBeanInfo modelMBeanInfo = createModelMBeanInfo();// 创建 ModelMBean 实例ModelMBean modelMBean = createModelMBean(modelMBeanInfo);// 创建 MBeanServerMBeanServer mbs = ManagementFactory.getPlatformMBeanServer();// 创建 ObjectName,用于标识 MBeanObjectName name = new ObjectName("com.example:type=ModelMBeanTest");// 注册 ModelMBean 到 MBeanServermbs.registerMBean(modelMBean, name);// 等待一段时间,使得可以通过 JConsole 或者其他 JMX 客户端来操作 MBeanThread.sleep(Long.MAX_VALUE);}}

Open MBean

        与传统的 Standard MBean 和 Dynamic MBean 不同,Open MBean 不需要预先定义接口,而是使用开放式的数据类型和操作来描述 MBean 的管理接口,使得可以更灵活地适应各种场景和需求。

@Component
public class SimpleOpenMBean extends NotificationBroadcasterSupport {// Constructorpublic SimpleOpenMBean() {super();openMBean();}// The actual value of the "SimpleProperty" attributeprivate int simpleProperty = 0;// Operation to reset the SimplePropertypublic void reset() {simpleProperty = 0;}public MBeanInfo openMBean() {OpenMBeanAttributeInfoSupport simplePropertyInfo =new OpenMBeanAttributeInfoSupport("SimpleProperty","The SimpleProperty of the SimpleOpenMBean",SimpleType.INTEGER,true,   // isReadabletrue,   // isWritablefalse); // isIsOpenMBeanConstructorInfoSupport constructorInfo =new OpenMBeanConstructorInfoSupport("SimpleOpenMBean","Constructs a SimpleOpenMBean instance",new OpenMBeanParameterInfoSupport[]{});OpenMBeanOperationInfoSupport resetOperationInfo =new OpenMBeanOperationInfoSupport("reset","Resets the SimpleProperty to 0",new OpenMBeanParameterInfoSupport[]{},SimpleType.VOID,MBeanOperationInfo.ACTION);return new OpenMBeanInfoSupport(SimpleOpenMBean.class.getName(),"SimpleOpenMBean Description",new OpenMBeanAttributeInfo[]{simplePropertyInfo},new OpenMBeanConstructorInfo[]{constructorInfo},new OpenMBeanOperationInfo[]{resetOperationInfo},new MBeanNotificationInfo[0]);}}

MXBean   

        在 Java 中,一切都被视为对象,而 JMX 则提供了一种标准化的方式来监控和管理 Java 程序的运行时状态、性能指标以及运行环境。而MXBean就是专门用于管理和监控这其中一些标准化类型的对象的,例如内存使用情况、线程信息、操作系统属性等。这些MBean是拿来即用的。

平台MXBean

       平台MXBean是 Java SE 平台提供的一组 MXBean,用于监视和管理 Java VM 以及 Java 运行时环境 (JRE) 的其他组件。每个平台 MXBean 都封装了一部分 Java VM 功能,例如类加载系统、即时 (JIT) 编译系统、垃圾收集器等。可以使用符合 JMX 规范的监视和管理工具显示这些 MXBean 并与之交互,以便您监视和管理这些不同的 VM 功能。Java SE 平台的 JConsole 图形用户界面 (GUI) 就是这样一种监视和管理工具。Java SE 平台提供了一个标准平台 MBean 服务器,这些平台 MXBean 都注册在该服务器中。平台 MBean 服务器还可以注册您希望创建的任何其他 MBean。

public class XMBeanTest {public static void main(String[] args) {// 获取内存管理MXBean,用于监控和管理Java虚拟机的内存系统MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();// 获取线程系统MXBean,用于监控和管理Java虚拟机的线程系统ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();// 获取运行时系统MXBean,用于获取Java虚拟机的运行时信息RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();// 获取操作系统MXBean,用于获取操作系统的相关信息OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();// 获取编译系统MXBean,用于获取Java虚拟机的即时编译器信息CompilationMXBean compilationMXBean = ManagementFactory.getCompilationMXBean();// 获取Java虚拟机堆内存的使用情况MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();// 获取Java虚拟机非堆内存的使用情况MemoryUsage nonHeapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage();// 获取类加载系统的MXBean,用于监控和管理Java虚拟机的类加载系统ClassLoadingMXBean classLoadingMXBean = ManagementFactory.getClassLoadingMXBean();// 获取所有内存池的MXBean列表,用于监控和管理Java虚拟机的内存池List<MemoryPoolMXBean> memoryPoolMXBeans = ManagementFactory.getMemoryPoolMXBeans();// 获取所有内存管理器的MXBean列表,用于监控和管理Java虚拟机的内存管理器List<MemoryManagerMXBean> memoryManagerMXBeans = ManagementFactory.getMemoryManagerMXBeans();// 获取所有垃圾收集器的MXBean列表,用于监控和管理Java虚拟机的垃圾收集器List<GarbageCollectorMXBean> garbageCollectorMXBeans = ManagementFactory.getGarbageCollectorMXBeans();System.out.println("Heap Memory Usage:");System.out.println("    Init: " + heapMemoryUsage.getInit() / (1024 * 1024) + " MB");System.out.println("    Used: " + heapMemoryUsage.getUsed() / (1024 * 1024) + " MB");System.out.println("    Committed: " + heapMemoryUsage.getCommitted() / (1024 * 1024) + " MB");System.out.println("    Max: " + heapMemoryUsage.getMax() / (1024 * 1024) + " MB");System.out.println("Non-Heap Memory Usage:");System.out.println("    Init: " + nonHeapMemoryUsage.getInit() / (1024 * 1024) + " MB");System.out.println("    Used: " + nonHeapMemoryUsage.getUsed() / (1024 * 1024) + " MB");System.out.println("    Committed: " + nonHeapMemoryUsage.getCommitted() / (1024 * 1024) + " MB");System.out.println("    Max: " + nonHeapMemoryUsage.getMax() / (1024 * 1024) + " MB");}
}

MBeanServer

  MBeanServer 是一个Java对象,它充当JMX代理的核心。它提供了一个注册和管理MBeans的环境。MBeans是遵循特定约定的Java对象,它们暴露了可以被管理的资源或服务。

MBeanServer作用
  • 注册和管理MBeans:MBeanServer 允许你注册MBeans,并通过ObjectName来引用它们。每个MBean都有一个唯一的ObjectName,它是MBeanServer用来识别和管理MBean的关键。
  • 提供访问接口:MBeanServer 提供了方法来访问MBeans的属性、调用操作、注册和接收通知。
  • 实现远程管理:通过连接器(如JMXMP或JMXRMI),MBeanServer 支持远程客户端的连接,从而允许远程管理和监控。
  • 支持多种协议:MBeanServer 可以通过不同的协议(如RMI、JMS、HTTP等)暴露MBeans。
MBeanServer关键特性
  • MBean注册:通过调用createMBeanregisterMBean方法,可以将MBean注册到MBeanServer中。
  • MBean操作:可以调用invoke方法来执行MBean的操作。
  • 属性访问:可以通过getAttributesetAttribute方法来读取和修改MBean的属性。
  • 事件和通知:MBeanServer 支持事件和通知机制,允许MBeans在特定事件发生时发送通知。
  • 代理和委托:MBeanServer 可以作为其他MBeanServer的代理或委托,实现更复杂的管理结构。
MBeanServer创建

        在Java应用程序中,通常使用以下方式来创建MBeanServer:

MBeanServer mBeanServer = MBeanServerFactory.createMBeanServer();

    如果使用JMX的javax.management.MBeanServerFactory

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();

  ManagementFactory.getPlatformMBeanServer() 方法返回的MBeanServer 是Java虚拟机启动时创建的平台MBeanServer。

MBeanServer使用

        以下是一些使用MBeanServer的基本步骤:

  1. 创建或获取MBeanServer实例。
  2. 创建MBean实例。
  3. 通过ObjectName注册MBean到MBeanServer
  4. 使用MBeanServer的方法来访问MBean的属性、调用操作或接收通知。
// 创建MBeanServer
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();// 创建ObjectName
ObjectName name = new ObjectName("com.example:type=MyMBean");// 创建MBean实例
MyMBean mbean = new MyMBeanImpl();// 注册MBean
mBeanServer.registerMBean(mbean, name);// 调用MBean操作
mBeanServer.invoke(name, "myOperation", new Object[]{}, new String[]{});// 读取MBean属性
Integer value = (Integer) mBeanServer.getAttribute(name, "MyAttribute");

JMX Agent

        JMX Agent是指一个运行在Java虚拟机(JVM)中的管理实体,它负责管理一个或多个MBeans(Managed Beans),并提供与外部管理应用程序(如JMX客户端)的通信接口。

JMX Agent的组成

        一个JMX agent 通常包含以下几个主要组件:

  1. MBeanServer:agent 的核心组件,负责注册和管理MBeans,并提供对MBeans的操作、属性访问和通知的接口。

  2. MBeans:实现具体管理功能的Java对象,它们可以是标准MBeans、动态MBeans、开放MBeans或模型MBeans。

  3. JMX Connector:允许远程管理应用程序通过特定的协议(如RMI、JMXMP、IIOP、HTTP等)连接到agent

  4. Service MBean:提供agent级别的服务,如安全管理、事件处理、监控服务等。

  5. Adaptor:将agent中的MBeans暴露给不同的管理协议,例如将MBeans通过JMX RMI连接器暴露给远程客户端。

JMX Agent的功能
  • 本地和远程管理:agent 支持本地和远程管理,使得管理员可以通过本地或远程JMX客户端对Java应用程序进行监控和管理。
  • 服务封装:agent 可以将Java应用程序中的服务封装成MBeans,从而便于管理。
  • 安全管理:agent 可以实现访问控制,确保只有授权的管理员可以访问或修改MBeans。
  • 事件和通知:agent 支持事件和通知机制,允许MBeans在特定事件发生时发送通知给感兴趣的监听者。
JMX Agent的生命周期
  • 启动:当Java应用程序启动时,JMX agent 也会启动,并创建MBeanServer。
  • 运行:在运行期间,agent 管理MBeans,处理来自JMX客户端的请求,发送和接收通知。
  • 关闭:当Java应用程序关闭时,agent 会进行清理工作,如注销MBeans,关闭连接器等。
JMX Agent创建

        创建一个简单的JMX agent 通常涉及以下步骤:

  1. 创建MBeanServer实例。
  2. 创建并注册MBeans到MBeanServer
  3. 创建JMX连接器,以便远程访问。
  4. 启动连接器,使agent 可以接受远程连接。
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;public class JMXAgent {public static void main(String[] args) throws Exception {// 创建MBeanServerMBeanServer mBeanServer = MBeanServerFactory.createMBeanServer();// 创建ObjectNameObjectName name = new ObjectName("com.example:type=MyMBean");// 创建并注册MBeanMyMBean mbean = new MyMBeanImpl();mBeanServer.registerMBean(mbean, name);// 创建JMX服务URLJMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");// 创建JMXConnectorServerJMXConnectorServer connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mBeanServer);// 启动连接器connectorServer.start();// 打印连接信息System.out.println("JMX Agent is running at: " + url);}
}

参考文献

官方文档 : https://docs.oracle.com/javase/tutorial/jmx/overview/index.html

【JMX】JAVA监控的基石-CSDN博客
JMX使用详解-CSDN博客

相关文章:

Java-JMX 组件架构即详解

JMX架构由三个主要组件构成&#xff1a; ‌MBeans&#xff08;Managed Beans&#xff09;‌&#xff1a;代表可管理的资源&#xff0c;是JMX的核心。MBean可以是Java类或接口&#xff0c;提供了管理操作的接口&#xff0c;如获取系统信息、设置参数等。‌MBeanServer‌&#x…...

unity打包web,发送post请求,获取地址栏参数,解决TypeError:s.replaceAll is not a function

发送post请求 public string url "http://XXXXXXXXX";// 请求数据public string postData "{\"user_id\": 1}";// Start is called before the first frame updatevoid Start(){// Post();StartCoroutine(PostRequestCoroutine(url, postData…...

java+ssm+mysql校园物品租赁网

项目介绍&#xff1a; 使用javassmmysql开发的校园物品租赁网&#xff0c;系统包含管理员、用户角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;用户管理&#xff1b;物品管理&#xff08;物品种类、物品信息、评论信息&#xff09;&#xff1b;订单管理&#xff1…...

Spring Boot中实现JPA多数据源配置指南

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;本文详细介绍了在Spring Boot项目中配置和使用JPA进行多数据源管理的步骤。从引入依赖开始&#xff0c;到配置数据源、创建DataSource bean、定义实体和Repository&#xff0c;最后到配置事务管理器和使用多数据…...

服务器加固

1.服务器密码复杂度 密码最小长度&#xff0c;密码复杂度策略 vim /etc/pam.d/system-auth --------------- #密码配置 #ucredit&#xff1a;大写字母个数&#xff1b;lcredit&#xff1a;小写字母个数&#xff1b;dcredit&#xff1a;数字个数&#xff1b;ocredit&#xff1a;…...

探索CSS中的背景图片属性,让你的网页更加美观

导语&#xff1a;在网页设计中&#xff0c;背景图片的运用能够丰富页面视觉效果&#xff0c;提升用户体验。本文将详细介绍CSS中背景图片的相关属性&#xff0c;帮助大家更好地掌握这一技能。 一、背景图片基本属性 1、background-image 该属性用于设置元素的背景图片。语法如…...

Oracle的打开游标(OPEN_CURSORS)

一、OPEN_CURSORS 概述 OPEN_CURSORS 指定会话一次可以拥有的打开游标&#xff08;私有 SQL 区域的句柄&#xff09;的最大数量。可以使用此参数来防止会话打开过多的游标。 OPEN_CURSORS参数说明 特性 描述 参数类型 Integer 默认值 50 修改方式 ALTER SYSTEM PDB级别…...

数值分析—数值积分

研究背景 积分的数学解法为牛顿莱布尼兹公式&#xff0c;数学表示为 ∫ a b f ( x ) d x F ( b ) − F ( a ) \int_{a}^{b} f(x)dxF(b)-F(a) ∫ab​f(x)dxF(b)−F(a)&#xff0c;但应用该方法有如下困难&#xff1a; 1&#xff0c; f ( x ) f(x) f(x)的原函数有时不能用初等函…...

克服大规模语言模型限制,构建新的应用方法——LangChain

大模型 大模型的出现和落地开启了人工智能(AI)新一轮的信息技术革命&#xff0c;改变了人们的生 活方式、工作方式和思维方式。大模型的落地需要数据、算力和算法三大要素。经过几 年发展&#xff0c;大模型的数据集(包括多模态数据集)制作已经形成了规约&#xff0c;Meta、Go…...

计算机网络 —— HTTPS 协议

前一篇文章&#xff1a;计算机网络 —— HTTP 协议&#xff08;详解&#xff09;-CSDN博客 目录 前言 一、HTTPS 协议简介 二、HTTPS 工作过程 1.对称加密 2.非对称加密 3.中间人攻击 4.引入证书 三、HTTPS 常见问题 1.中间人能否篡改证书&#xff1f; 2.中间人能否调…...

React第十七章(useRef)

useRef 当你在React中需要处理DOM元素或需要在组件渲染之间保持持久性数据时&#xff0c;便可以使用useRef。 import { useRef } from react; const refValue useRef(initialValue) refValue.current // 访问ref的值 类似于vue的ref,Vue的ref是.value&#xff0c;其次就是vu…...

React第十五节useReducer使用详解差异

useReducer() 的用法注意事项 1、 概述&#xff1a; useReducer() 常用于管理复杂的状态更新逻辑&#xff0c;特别是在状态更新依赖于多个条件或动作时&#xff0c;useReducer 提供了一种更加结构化和可维护的方式来处理状态。可以将更新函数写在组件外面 它与 useState() 相…...

NanoLog起步笔记-5-客户端简要描述

nonolog起步笔记-5-客户端简要描述 客户端的简要的设计图路notify模式服务端最好分两个核 NanoLog::setLogLevel(NOTICE);从 NANO_LOG 开始NANO_LOGcompiling time的语句getNumNibblesNeeded&#xff1a;得到prompt中&#xff0c;number的数量countFmtParams&#xff1a;得到所…...

Flink:入门介绍

目录 一、Flink简介 2.1 Flink 架构 2.2 Flink 应用程序 运行模式 二、Flink 集群 部署 2.1 本地集群模式 2.1.1 安装JDK​编辑 2.1.2 下载、解压 Flink 2.1.3 启动集群 2.1.4 停止集群 2.2 Standalone 模式 2.2.0 集群规划 2.2.1 安装JDK 2.2.2 设置免密登录 2…...

目标跟踪领域经典论文解析

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在…...

网络编程 | TCP套接字通信及编程实现经验教程

1、TCP基础铺垫 TCP/IP协议簇中包含了如TCP、UDP、IP、ICMP、ARP、HTTP等通信协议。TCP协议是TCP/IP协议簇中最为常见且重要的通信方式之一&#xff0c;它为互联网上的数据传输提供了可靠性和连接管理。 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议…...

SAP导出表结构并保存到Excel 源码程序

SAP导出表结构并保存到Excel,方便写代码时复制粘贴 经常做接口,需要copy表结构,找到了这样一个程程,特别有用。 01. 先看结果...

Linux下redis环境的搭建

1.redis的下载 redis官网下载redis的linux压缩包&#xff0c;官网地址:Redis下载 网盘链接&#xff1a; 通过网盘分享的文件&#xff1a;redis-5.0.4.tar.gz 链接: https://pan.baidu.com/s/1cz3ifYrDcHWZXmT1fNzBrQ?pwdehgj 提取码: ehgj 2.redis安装与配置 将包上传到 /…...

REDMI瞄准游戏赛道,推出小屏平板

近日&#xff0c;REDMI推出了一款8.8英寸的小屏平板&#xff0c;引发市场关注。该平板采用LCD屏幕&#xff0c;搭载天玑9400处理器&#xff0c;定位游戏市场&#xff0c;意在开拓小屏平板的新领域‌。 ‌小屏平板新尝试‌ 这款REDMI平板未追随大屏潮流&#xff0c;而是选择了8…...

springai结合ollama

目录 ollama 介绍 使用 下载&#xff1a; 安装&#xff1a; 点击这个玩意next就行了。 运行 spring ai使用ollama调用本地部署的大模型 加依赖 配置yml 写代码 ollama 介绍 官网&#xff1a;Ollama Ollama是一个用于部署和运行各种开源大模型的工具&#xff1b; …...

React第十三节开发中常见问题之(视图更新、事件处理)

一、视图更新有哪些方案&#xff1f; useState用法介绍 1、对于数据变量 正常的增删改查&#xff0c;只会让数据更新&#xff0c;但是不会触发 React 视图的更新&#xff1b; 如&#xff1a; <script lang"jsx">const baseTable [{name:Andy, age: 18, id…...

【Appium报错】安装uiautomator2失败

目录 1、通过nmp安装uiautomator2&#xff1a;失败 2、通过 Appium 的平台直接安装驱动程序 3、通过pip 来安装 uiautomator2 1、通过nmp安装uiautomator2&#xff1a;失败 我先是通过npm安装的uiautomator2&#xff0c;也显示已经安装成功了&#xff1a; npm install -g …...

DataSophon集成CMAK KafkaManager

本次集成基于DDP1.2.1 集成CMAK-3.0.0.6 设计的json和tar包我放网盘了. 通过网盘分享的文件&#xff1a;DDP集成CMAK 链接: https://pan.baidu.com/s/1BR70Ajj9FxvjBlsOX4Ivhw?pwdcpmc 提取码: cpmc CMAK github上提供了zip压缩包.将压缩包解压之后 在根目录下加入启动脚本…...

Ubuntu22.04深度学习环境安装【显卡驱动安装】

前言 使用Windows配置环境失败&#xff0c;其中有一个包只有Linux版本&#xff0c;Windows版本的只有python3.10的&#xff0c;所以直接选用Linux来配置环境&#xff0c;显卡安装比较麻烦&#xff0c;单独出一期。 显卡驱动安装 方法一&#xff1a;在线安装&#xff08;操作…...

21届秋/校招面经

开篇先说一下我自身情况&#xff0c;东南大学本科计算机科学与技术专业毕业&#xff0c;gpa3.2/4.8。零零散散搞过一年多ACM&#xff0c;去年&#xff08;2019&#xff09;在icpc上海站拿了铜之后增加了信心&#xff08;因为当时训练总时间半年不到&#xff09;&#xff0c;于是…...

相机动态/在线标定

图1 图2 基本原理 【原理1】平行线在射影变换后会交于一点。如图所示,A为相机光心,蓝色矩形框为归一化平面,O为平面中心。地面四条黄色直线为平行且等距的车道线。HI交其中两条车道线于H、I, 过G作HI的平行线GM交车道线于M。HI、GM在归一化平面上的投影分别为JK、PN,二者会…...

MySQL 8.0 新特性汇总

文章目录 前言1. 运维管理 1.1 可持久化变量1.2 管理员端口1.3 资源组1.4 数据库粒度只读1.5 show processlist 实现方式1.6 加速索引创建速度1.7 控制连接的内存使用量1.8 克隆插件1.9 mysqldump 新增参数1.10 慢日志增强1.11 快速加列1.12 InnoDB 隐藏主键1.13 Redo 配置1.14…...

Resnet C ++ 部署 tensort 部署(四)

Resnet C 部署 pytorch功能测试&#xff08;一&#xff09; Resnet C 部署 模型训练&#xff08;二&#xff09; Resnet C 部署 模型测试&转 onnx&#xff08;三&#xff09; Resnet C 部署 tensort 部署&#xff08;四&#xff09; 之后&#xff0c;开始onnx 转trt 部…...

《Java核心技术I》对并发散列映射的批操作

对并发散列映射的批操作 Java API提供了批处理&#xff0c;计时其他线程处理映射&#xff0c;这些操作也能安全的执行。 3种不同操作&#xff1a; search(搜索)&#xff0c;为每个键或值应用一个函数&#xff0c;直到函数生成一个非null的结果&#xff0c;然后搜索终止&…...

记录一次使用git无权限的问题排查

正常的配置了公私钥之后&#xff0c;在gitlab中也存储了配对的公钥&#xff0c;但当使用git clone 时&#xff0c;总是报无权限 由于在这台机器中添加了多个公私钥&#xff0c;有点复杂&#xff0c;我们可以使用命令 ssh -vvvT 调试一下 ssh -vvvT yourGitlabAddr...

wordpress外网ip访问不了/2023年8月份新冠

Session 用于保存每个用户的专用信息. 每个客户端用户访问时&#xff0c;服务器都为 每个用户分配一个唯一的会话 ID&#xff08;Session ID) . 她的生存期是用户持续请求时 间再加上一段时间(一般是 20 分钟左右).Session 中的信息保存在 Web 服务器内 容中,保存的数据量可大可…...

如何做淘宝cms导购网站/百度网址链接是多少

前些天在学习linux下的驱动编写&#xff0c;找到了一块之前淘到的液晶屏&#xff0c;主控芯片是ili9341&#xff0c;分辨率为240*320的屏幕&#xff0c;接口方式是SPI的&#xff0c;心血来潮想搞一下。不过奈何驱动水平不到家&#xff0c;只是开发出了一种杂交方法&#xff0c;…...

网站服务器有什么区别/培训班该如何建站

JsoupJsoup 是一款轻量高效的 html 文档解析工具&#xff0c;可类比 xml 中的 dom4j 、jdomJsoup中的基本类DocumentHtml 整个文档在内容中的数据结构&#xff0c;继承 ElementElement标记元素的数据结构 &#xff0c;继承 NodeElementsElement 的集合&#xff0c;继承 ArrayLi…...

下载app官方正版/郑州seo全网营销

在面向程序设计中&#xff0c;类与类之间的关系主要有关联关系、依赖关系、泛化关系、接口与实现关系共四种关系。下面将简要进行概述&#xff1a; 一、关联关系 关联关系是类与类中较为常见的关系&#xff0c;其中又包含了以下六种子关联关系&#xff1a; &#xff08;一&…...

web网站建设/宁波网络推广公司有哪些

关于字符集和Unicode的相关知识 src url:http://www.blueidea.com/tech/program/2010/7432.asp 作者&#xff1a;Joel Spolsky 时间&#xff1a; 2010-03-12 文档类型&#xff1a;翻译 第 1 页 关于字符集和Unicode的相关知识 [1] 第 2 页 关于字符集和Unicode的相关知识 […...

python做网站用什么框架/竞价网络推广培训

RFID防碰撞算法学习 引用文章地址 RFID中的碰撞问题主要分为两类&#xff1a;一是阅读器碰撞问题&#xff0c;它产生于同一个物理区域内存在多个不同的阅读器&#xff0c;它们以同一频率同时与区域内的标签通信而引起的冲突。另一类是标签碰撞问题&#xff0c;如过标签同事处于…...