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

Tomcat优化指南

以下是一份详细的Tomcat优化指南:

一、JVM(Java虚拟机)优化

  1. 内存设置
    • 堆内存(Heap Memory)
      • 调整-Xms(初始堆大小)和-Xmx(最大堆大小)参数。一般来说,将初始堆大小和最大堆大小设置为相同的值可以避免在堆内存扩展时的性能开销。例如,对于一个有足够内存的服务器,你可以设置-Xms4g -Xmx4g,这表示初始堆和最大堆大小都是4GB。
      • 根据应用程序的负载和内存使用情况来确定合适的堆大小。如果应用程序处理大量的数据对象,可能需要更大的堆内存。
    • 非堆内存(Non - Heap Memory)
      • 调整-XX:PermSize(初始永久代大小)和-XX:MaxPermSize(最大永久代大小),在Java 8及以后版本,永久代被元空间(Metaspace)取代,需要调整-XX:MetaspaceSize-XX:MaxMetaspaceSize。例如,设置-XX:MetaspaceSize = 256m -XX:MaxMetaspaceSize = 512m,这可以为类的元数据提供足够的空间,避免java.lang.OutOfMemoryError: Metaspace错误。
  2. 垃圾回收器(Garbage Collector)选择与优化
    • 吞吐量优先的垃圾回收器(如Parallel GC)
      • 如果你的应用程序对吞吐量有较高的要求,例如批量处理任务的系统,可以考虑使用Parallel GC。它通过并行执行垃圾回收线程来提高垃圾回收的效率。可以通过-XX:+UseParallelGC参数来启用。
      • 同时,可以设置-XX:ParallelGCThreads=n来指定并行垃圾回收的线程数,n一般可以设置为CPU核心数。
    • 低延迟优先的垃圾回收器(如CMS或G1)
      • 对于对响应时间敏感的应用程序,如Web应用,CMS(Concurrent Mark - Sweep)或G1(Garbage - First)垃圾回收器可能更合适。
      • CMS可以通过-XX:+UseConcMarkSweepGC启用。它在垃圾回收过程中尽量减少应用程序的停顿时间,通过并发标记和清除阶段来实现。
      • G1是一种自适应的垃圾回收器,它将堆内存划分为多个大小相等的区域,通过预测垃圾回收的收益来选择回收区域。可以通过-XX:+UseG1GC启用,并且可以通过-XX:MaxGCPauseMillis=n来设置最大垃圾回收停顿时间,n通常可以设置为200毫秒左右,具体根据应用的响应时间要求来调整。

二、Tomcat自身配置优化

  1. 线程池优化
    • 调整线程池大小
      • server.xml文件中,找到<Executor>元素(如果没有可以添加),它用于定义Tomcat的线程池。例如:
        <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"maxThreads="200" minSpareThreads="4"/>
        
      • maxThreads参数表示最大线程数,它决定了Tomcat能够同时处理的请求数量。根据服务器的CPU核心数和预期的并发请求量来调整。一般可以按照每个CPU核心200 - 300个线程的比例来设置。
      • minSpareThreads参数表示最小空闲线程数,当没有请求时,Tomcat会保持这些线程处于空闲状态,以便快速响应新的请求。
    • 队列长度调整
      • 对于Connector元素(用于定义Tomcat的连接),有一个acceptCount参数。例如:
        <Connector executor="tomcatThreadPool"port="8080" protocol="HTTP/1.1"connectionTimeout="20000"acceptCount="100"/>
        
      • acceptCount表示当所有的处理线程都在忙碌时,允许等待的连接队列长度。如果队列已满,新的连接请求将被拒绝。根据应用程序的负载和服务器性能来合理设置,避免设置过小导致请求丢失,或者设置过大导致内存消耗过多。
  2. 连接优化
    • 启用持久连接(Keep - Alive)
      • Connector元素中,设置keepAliveTimeoutmaxKeepAliveRequests参数。例如:
        <Connector executor="tomcatThreadPool"port="8080" protocol="HTTP/1.1"connectionTimeout="20000"keepAliveTimeout="15000"maxKeepAliveRequests="100"/>
        
      • keepAliveTimeout表示在持久连接中,如果没有新的请求,连接保持空闲的最长时间。maxKeepAliveRequests表示在一个持久连接中允许的最大请求数量。启用持久连接可以减少TCP连接建立和拆除的开销,提高性能。
    • 调整连接超时时间(Connection Timeout)
      • connectionTimeout参数表示连接建立的超时时间。合理设置这个时间可以避免因为连接建立过慢而占用过多资源。一般可以设置为20 - 30秒,具体根据网络环境和应用需求来调整。

三、应用程序优化

  1. 数据库连接池优化(如果应用涉及数据库)
    • 选择合适的数据库连接池
      • 如HikariCP、Druid等。这些连接池在性能、资源管理等方面都有出色的表现。以HikariCP为例,它具有高效的连接获取和释放机制,能够减少连接获取的时间开销。
    • 调整连接池大小
      • 根据应用程序的数据库访问负载来确定连接池的大小。连接池大小过小可能导致数据库连接等待时间过长,而过大可能会浪费数据库资源。一般可以根据数据库的最大并发连接数限制和应用程序的实际并发数据库访问量来设置。
  2. 缓存策略优化
    • 本地缓存(如Ehcache、Guava Cache)
      • 对于经常访问的数据,可以使用本地缓存来减少对后端服务(如数据库)的访问。以Guava Cache为例,它提供了简单易用的缓存API。例如:
        import com.google.common.cache.CacheBuilder;
        import com.google.common.cache.Cache;public class CacheExample {private static final Cache<String, Object> cache = CacheBuilder.newBuilder().maximumSize(1000).expireAfterWrite(60, TimeUnit.SECONDS).build();public static Object getFromCache(String key) {return cache.getIfPresent(key);}public static void putInCache(String key, Object value) {cache.put(key, value);}
        }
        
      • 在这个例子中,CacheBuilder用于构建缓存,maximumSize参数限制了缓存的最大容量,expireAfterWrite参数设置了数据在缓存中的过期时间。
    • 分布式缓存(如Redis、Memcached)
      • 对于多节点的应用程序,分布式缓存可以提供更好的一致性和共享数据的功能。以Redis为例,它可以用于缓存数据库查询结果、会话数据等。通过合理设置缓存的键值和过期时间,可以有效提高应用程序的性能。

四、服务器硬件与网络优化

  1. 硬件升级(如果可能)
    • CPU升级
      • 如果服务器的CPU负载一直处于高位,考虑升级到更高性能的CPU或者增加CPU核心数。例如,从低频多核CPU升级到高频多核CPU,或者在服务器支持的情况下添加更多的CPU。
    • 内存升级
      • 当应用程序出现内存不足的情况,如频繁的OutOfMemoryError,可以考虑增加服务器的内存容量。同时,确保内存的频率和延迟等参数与服务器主板和CPU兼容,以获得最佳性能。
    • 存储升级
      • 如果应用程序的存储I/O是性能瓶颈,例如数据库存储或文件存储,可以考虑升级到更快的存储设备,如固态硬盘(SSD)来替代机械硬盘,以提高存储读写速度。
  2. 网络优化
    • 带宽升级
      • 如果应用程序的网络带宽使用率经常达到饱和,导致响应时间变慢或者数据传输延迟,考虑升级网络带宽。同时,与网络服务提供商协商优化网络路由和QoS(Quality of Service)策略,以确保关键应用的网络性能。
    • 优化网络配置(如TCP参数)
      • 调整服务器的TCP参数,如TCP_NODELAY(禁用Nagle算法,减少小数据包的延迟)、TCP_SYNCNT(调整TCP三次握手的重试次数)等。这些参数的优化需要根据服务器的网络环境和应用程序的特点来进行,以提高网络传输效率。

五、安全相关优化(在保障性能的同时加强安全性)

  1. 启用安全协议
    • HTTPS配置优化
      • 在Tomcat中配置HTTPS时,选择合适的SSL/TLS协议版本和加密套件。尽量避免使用已经被发现有安全漏洞的旧协议版本,如SSLv3。可以使用TLSv1.2或TLSv1.3。
      • 对于加密套件,选择强度高且性能较好的组合。例如,推荐使用带有AES - GCM(高级加密标准 - 伽罗瓦计数器模式)加密算法的套件,如TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256。
      • 可以使用密钥存储(Key Store)和信任存储(Trust Store)来管理服务器证书和客户端证书。确保密钥存储的密码足够复杂,并定期更新证书。
  2. 访问控制优化
    • 基于角色的访问控制(RBAC)
      • 在应用程序中,通过Spring Security(如果是基于Spring的应用)或其他安全框架,实施RBAC。定义不同的角色(如管理员、普通用户等),并为每个角色分配相应的权限。
      • 例如,在Tomcat的web.xml文件中,可以配置安全约束来限制对特定资源的访问。如:
        <security-constraint><web-resource-collection><web-resource-name>Admin Area</web-resource-name><url-pattern>/admin/*</url-pattern></web-resource-collection><auth-constraint><role-name>admin</role-name></auth-constraint>
        </security-constraint>
        
      • 此配置限制了只有具有“admin”角色的用户才能访问以“/admin/”开头的资源。
    • IP地址过滤
      • 可以通过防火墙或者在Tomcat层面(如使用Valve)进行IP地址过滤。例如,在server.xml文件中添加RemoteAddrValve来限制特定IP地址或IP段的访问。
        <Valve className="org.apache.tomcat.util.net.ipfilter.RemoteAddrValve"allow="127.0.0.1,192.168.1.0/24"/>
        
      • 上述配置允许来自本地地址(127.0.0.1)和网段192.168.1.0/24的访问,其他IP地址的访问将被拒绝。

六、日志优化

  1. 日志级别调整
    • 根据应用程序的运行阶段和需求,合理调整日志级别。在生产环境中,对于大多数应用组件,可以将日志级别设置为WARNERROR,以减少日志输出量。
    • 例如,在log4j.properties(如果使用Log4j)或者application.properties(如果使用Spring Boot的默认日志配置)中,调整日志级别:
      • log4j.rootLogger=WARN, stdout(针对Log4j)
      • logging.level.root=WARN(针对Spring Boot默认日志)
  2. 日志存储优化
    • 本地存储优化
      • 如果日志存储在本地文件系统,确保日志文件所在的磁盘分区有足够的空间。可以定期清理旧的日志文件,或者使用日志轮转(Log Rotation)机制,如logrotate(在Linux系统中)来管理日志文件大小。
    • 分布式日志存储(如ELK Stack)
      • 对于大规模的应用系统,考虑使用分布式日志存储解决方案,如ELK Stack(Elasticsearch、Logstash、Kibana)。
      • Logstash可以收集来自多个Tomcat实例的日志,并将其发送到Elasticsearch进行存储和索引。Kibana可以用于可视化地分析和查询日志,方便监控和故障排查。例如,配置Logstash来收集Tomcat日志:
        input {file {path => "/var/log/tomcat/*.log"start_position => "beginning"codec => plain {charset => "UTF-8"}}
        }
        output {elasticsearch {hosts => ["localhost:9200"]index => "tomcat - logs - %{+YYYY.MM.dd}"}
        }
        
      • 此配置从/var/log/tomcat/目录下收集日志文件,将其发送到本地的Elasticsearch实例,并按照日期创建索引。
        在这里插入图片描述

七、监控与调优的持续循环

  1. 性能监控工具使用
    • JMX(Java Management Extensions)监控
      • Tomcat内置了JMX支持,可以使用JConsole或VisualVM等工具来监控Tomcat的运行状态。这些工具可以显示JVM的内存使用情况、线程状态、垃圾回收情况等。
      • 例如,通过JConsole连接到Tomcat的JMX端口(默认是localhost:9005),可以查看堆内存的使用曲线,及时发现内存泄漏或过度使用的情况。
    • 应用性能管理(APM)工具
      • 如New Relic、AppDynamics等。这些工具可以深入到应用程序的代码层面,监控方法的执行时间、数据库查询时间等。
      • 以New Relic为例,安装其Java代理后,可以在其Web界面上查看应用程序的性能指标,包括每个请求的响应时间分解、数据库调用次数等,帮助定位性能瓶颈。
  2. 根据监控结果进行调优
    • 定期分析监控数据,根据性能瓶颈(如高CPU使用率、高内存占用、长请求响应时间等)来调整优化策略。
    • 例如,如果发现某个特定的数据库查询是性能瓶颈,可能需要优化查询语句、添加索引或者调整数据库连接池策略。如果发现内存泄漏的迹象,可能需要检查代码中的对象生命周期管理和资源释放情况。通过这种持续的监控和调优循环,可以不断提高Tomcat应用系统的性能和稳定性。

八、优化Tomcat的启动过程

  1. 减少不必要的模块加载
    • 检查server.xml文件和相关的配置文件,确定是否有一些不必要的服务或模块被加载。例如,如果应用程序不需要JNDI(Java Naming and Directory Interface)的某些高级功能,如LDAP(Lightweight Directory - Access Protocol)查找,可以考虑禁用相关的JNDI资源配置,从而减少启动时间和内存占用。
    • 对于一些很少使用的Tomcat自带的Web应用(如示例应用),可以将其从webapps目录中移除或者在server.xml中禁用它们的部署。
  2. 优化类加载顺序和策略
    • Tomcat使用类加载器来加载应用程序的类。了解和优化类加载顺序可以提高启动速度。一般来说,Tomcat有多个类加载器,包括共享类加载器(Shared Class Loader)和Web应用类加载器(Web Application Class Loader)。
    • 可以通过调整catalina.properties文件中的类加载器相关配置来优化。例如,合理设置common.loaderserver.loadershared.loader等属性,明确哪些类应该由共享类加载器加载,哪些应该由各个Web应用自己的类加载器加载,避免不必要的类重复加载。

九、优化Web应用部署结构

  1. 合并和精简Web应用资源
    • 检查Web应用中的静态资源(如CSS、JavaScript、图片等),尽可能地合并和压缩这些资源。可以使用工具如YUI Compressor(用于JavaScript和CSS压缩)、ImageOptim(用于图片优化)等。
    • 例如,将多个小的CSS文件合并为一个文件,并删除其中的注释和多余的空格,这样可以减少浏览器请求的次数和文件大小,提高页面加载速度。对于JavaScript文件也可以采用类似的方法。
  2. 合理划分Web应用模块
    • 如果应用程序比较复杂,包含多个功能模块,考虑将其划分为多个子Web应用或者微服务(如果适用)。这样可以使每个模块的部署和更新更加灵活,并且可以独立地进行优化和扩展。
    • 例如,将用户认证模块、核心业务模块和报表模块划分为不同的Web应用,通过合理的接口进行交互。在优化时,可以针对每个模块的性能瓶颈进行有针对性的处理,而不会影响到其他模块的正常运行。

十、利用缓存优化静态内容和动态内容的生成

  1. 静态内容缓存
    • 对于不经常变化的静态内容(如HTML页面、样式表、脚本文件等),可以在Web服务器(如Nginx或Apache)层面设置缓存。例如,在Nginx中,可以配置如下缓存规则:
      http {proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;server {location / {proxy_cache my_cache;proxy_cache_valid 200 302 60m;proxy_cache_valid 404 10m;proxy_pass http://tomcat_server;}}
      }
      
      • 上述配置在Nginx中创建了一个名为my_cache的缓存区域,用于缓存从Tomcat服务器获取的内容。proxy_cache_valid语句定义了不同状态码(如200、302和404)对应的缓存有效期。
  2. 动态内容缓存(片段缓存)
    • 对于动态生成的内容,考虑使用片段缓存。例如,在Java Web应用中,可以使用框架如JSP Taglibs或Spring MVC的缓存机制。
    • 以Spring MVC为例,可以使用@Cacheable注解来缓存方法的返回结果。假设在一个控制器方法中返回一个用户信息列表,这个列表的生成比较耗时(如涉及数据库查询),可以这样缓存:
      import org.springframework.cache.annotation.Cacheable;
      import java.util.List;@Controller
      public class UserController {@Cacheable("userListCache")@RequestMapping("/users")public List<User> getUsers() {// 这里是获取用户列表的逻辑,可能涉及数据库查询等return userList;}
      }
      
      • 当第一次访问/users路径时,方法的返回结果会被缓存到名为userListCache的缓存中。之后在缓存有效期内再次访问时,将直接从缓存中获取结果,而不需要重新执行获取用户列表的逻辑,从而提高性能。

相关文章:

Tomcat优化指南

以下是一份详细的Tomcat优化指南&#xff1a; 一、JVM&#xff08;Java虚拟机&#xff09;优化 内存设置 堆内存&#xff08;Heap Memory&#xff09; 调整-Xms&#xff08;初始堆大小&#xff09;和-Xmx&#xff08;最大堆大小&#xff09;参数。一般来说&#xff0c;将初始…...

本地调试自定义Maven Plugin步骤

添加自定义插件到dependencies 找到对应依赖的类&#xff0c;打上断点。 debug运行插件。...

css实现文字描边

效果 学习啦 -webkit-text-stroke-width&#xff1a; 设置文本描边的宽度&#xff0c;值可以是任何长度单位&#xff08;如 px, em, rem 等&#xff09; -webkit-text-stroke-color&#xff1a;设置文本描边的颜色&#xff0c;值可以是任何颜色值&#xff08;如 red, green, bl…...

B2B营销的新篇章:开源AI智能名片S2B2C商城小程序的应用探索

摘要&#xff1a; B2B营销&#xff0c;作为企业间营销活动的总称&#xff0c;因其独特的业务特性而呈现出不同于B2C营销的显著特征。在数字化转型的大潮中&#xff0c;B2B企业正积极探索新的营销手段以提高效率和竞争力。本文旨在探讨B2B营销的基本特性&#xff0c;并重点引入…...

坐标系统转换方法研究与实现

坐标系统转换方法研究与实现 摘要:坐标系统是测量工作中定位的基础,坐标系统有很多形式和基准,不同历史时期所建立和使用的坐标系是不同的。随着科学技术的进步,测量方法和观测技术不断改进,采用的参考椭球及定位方式也逐步完善和精化。为更加精确的确定点位信息并综合利…...

naive ui 使用地址记录

naive ui 地址Naive UI Naive UI 是一个 Vue3 的组件库。 要了解如何安装&#xff0c;参见安装。 它比较完整&#xff0c;主题可调&#xff0c;用 TypeScript 写的&#xff0c;快...

std__invoke 的使用

std__invoke 的使用 文章目录 std__invoke 的使用1. std::invoke 的功能2. 语法3. 使用场景1. 调用普通函数2. 调用成员函数3. 调用成员函数&#xff08;通过指针或引用&#xff09;4. 调用函数对象&#xff08;仿函数&#xff09;5. 调用 Lambda 表达式 4. std::invoke 的优势…...

【Vue】深入理解v-model指令-父子组件数据绑定

一、什么是v-model&#xff1f; v-model是Vue.js中的一个指令&#xff0c;用于在表单元素上实现数据的双向绑定。简单来说&#xff0c;v-model可以让我们轻松地读取和更新数据&#xff0c;无需手动操作DOM。 二、标签选择器组件分析 我们先来看一下子组件的代码&#xff1a;…...

html+css+js网页设计 美食 六角西餐厅美食3个页面

htmlcssjs网页设计 美食 六角西餐厅美食3个页面 (带js) 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取…...

ubuntu 常见问题(持续记录)

1 ubuntu server 22.04 设置静态 IP ubuntu server 在重启之后&#xff0c;IP 会变化&#xff0c;这很不利于作内网穿透&#xff0c;因此很有必要使用静态 IP。 登录进系统之后&#xff1a; cd /etc/netplan/ ls # 我这里是 50-cloud-init.yamlifconfig # 查看网卡接口&…...

网络安全 | 物联网安全:从设备到网络的全方位防护

网络安全 | 物联网安全&#xff1a;从设备到网络的全方位防护 一、前言二、物联网设备安全2.1 物联网设备的特点与安全风险2.2 物联网设备安全防护策略 三、物联网网络通信安全3.1 物联网网络通信的安全挑战3.2 物联网网络通信安全防护措施 四、物联网数据安全4.1 物联网数据的…...

浅谈torch.utils.data.TensorDataset和torch.utils.data.DataLoader

1.torch.utils.data.TensorDataset 功能定位 torch.utils.data.TensorDataset 是一个将多个张量&#xff08;Tensor&#xff09;数据进行简单包装整合的数据集类&#xff0c;它主要的作用是将相关联的数据&#xff08;比如特征数据和对应的标签数据等&#xff09;组合在一起&…...

大模型 LangChain 开发框架-初探

大模型 LangChain 开发框架-初探 一、LangChain 概述 LangChain 是一个强大的由大型语言模型&#xff08;LLM&#xff09;驱动的应用程序开发框架。它的核心价值在于提供了标准化组件接口、高效的任务编排能力以及可观察性和评估机制。通过这些特性&#xff0c;LangChain 有效…...

MySQL 窗口函数

MySQL 窗口函数 1&#xff0c;窗口函数 1.1&#xff0c;什么是窗口函数1.2&#xff0c;基本语法 2&#xff0c;函数详解 2.1&#xff0c;聚合函数2.2&#xff0c;排序函数2.3&#xff0c;偏移函数2.4&#xff0c;值函数 3&#xff0c;进阶用法 1&#xff0c;窗口函数 1.1&am…...

【大模型系列】MultiUI(2024.11)

Paper&#xff1a;https://arxiv.org/pdf/2410.13824Github&#xff1a;https://neulab.github.io/MultiUI/Author&#xff1a;Junpeng Liu et al., 卡内基梅隆 核心1&#xff1a; 先基于text-based LLMs获取网页的accessibility tree(辅助功能树&#xff0c;https://200t.w3c…...

学习笔记079——数据结构之【树】

文章目录 1、重点概念1.1、结点概念1.2、树节点声明 2、树2.1、定义2.2、结点的度2.3、结点关系2.4、结点层次2.5、树的深度 3、二叉树3.1、定义3.2、二叉树特点3.3、二叉树性质3.4、斜树3.5、满二叉树3.6、完全二叉树3.7、二叉树的存储结构3.7.1、顺序存储3.7.2、二叉链表 3.8…...

CPT203 Software Engineering 软件工程 Pt.3 系统建模(中英双语)

文章目录 5. System Modeling&#xff08;系统建模&#xff09;5.1 Context models&#xff08;上下文模型&#xff09;5.2 Interaction models&#xff08;交互模型&#xff09;5.2.1 Use case modeling&#xff08;用况建模&#xff09;5.2.2 Sequence diagram&#xff08;顺…...

vue使用vue-seamless-scroll进行轮播滚动展示内容

我这里只是记录下一些基本的东西&#xff0c;具体大家可以查看官网介绍&#xff0c;有更详细的使用文档&#xff08;目前有vue和js版本&#xff09;&#xff1a; https://chenxuan0000.github.io/vue-seamless-scroll/zh/ 安装组件&#xff1a; npm install vue-seamless-scro…...

python入门

目录 一、Python的诞生 二、Python的特点 三、Python环境的搭建 1.搭建运行环境 2.搭建开发环境 一、Python的诞生 如果大家在上大学之前有接触过一些关于编程的课程&#xff0c;Python绝对是最早接触的语言之一。 在学习任何一门编程语言之前&#xff0c;都需要了解它的…...

深度解析 Python 网络框架:Django、Tornado、Flask 和 Twisted

目录 引言Python 网络框架概述Django&#xff1a;全栈开发的首选框架 3.1 Django 的核心特性3.2 Django 的应用场景3.3 优势与不足 Tornado&#xff1a;高性能的异步框架 4.1 Tornado 的异步特性4.2 Tornado 的应用场景4.3 优势与不足 Flask&#xff1a;轻量级的微框架 5.1 Fl…...

摆脱Zotero存储限制:WebDAV结合内网穿透打造个人文献管理云平台

文章目录 前言一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zotero文献库五、使用永久固定公网地址同步Zotero文献库 前言 如果你是科研工作者、学生或者任何需要频繁处理大量学术资料的人士&#xff0c;你一定对如何高效管理和引用文献感到头…...

Unity 对Sprite或者UI使用模板测试扣洞

新建两个材质球&#xff1a; 选择如下材质 设置如下参数&#xff1a; 扣洞图片或者扣洞UI的材质球 Sprite或者UI的材质球 新建一个单独Hole的canvas&#xff0c;将SortOrder设置为0&#xff0c;并将原UI的canvans的SortOrder设置为1 对2DSprite则需要调整下方的参数 hole的O…...

Wend看源码-Java-Arrays 工具集学习

摘要 java.util.Arrays 是 Java 标准库中的一个实用工具类&#xff0c;它提供了各种静态方法来操作数组&#xff0c;包括排序、搜索、比较、填充等。这些方法简化了对数组的操作&#xff0c;并且在很多情况下可以提高代码的可读性和效率。以下是关于Arrays类中提供的一些主要方…...

【算法复健】0102 快速选择算法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、算法引入1. 冒泡排序2.快速排序3. 快速选择(1)题目&#xff1a;数组中的第K个最大元素&#xff08;2&#xff09;代码 前言 本文由快速排序算法引入快速选…...

【疑难杂症】 HarmonyOS NEXT中Axios库的响应拦截器无法拦截424状态码怎么办?

今天在开发一个HarmonyOS NEXT的应用的时候&#xff0c;发现http接口如果返回的状态码是424时&#xff0c;我在axios中定义的拦截器失效了。直接走到了业务调用的catch中。 问题表现&#xff1a; 我的拦截器代码如下&#xff1a; 解决办法&#xff1a; 先说解决办法&#xff…...

口语笔记——使动词

每个使动词都可以有三种形式&#xff0c;以move为例&#xff1a; move作为动词可表达&#xff1a;使……感动&#xff0c;让……感动&#xff0c;通常用于主谓宾结构。ed作为形容词可表达&#xff1a;感动的&#xff0c;通常用于主系表结构。ing作为形容词可表达&#xff1a;令…...

SQL-leetcode-196. 删除重复的电子邮箱

196. 删除重复的电子邮箱 表: Person -------------------- | Column Name | Type | -------------------- | id | int | | email | varchar | -------------------- id 是该表的主键列(具有唯一值的列)。 该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。 编写解…...

汇编语言:从键盘输入数字字符,(计算阶乘),以无符号十进制形式输出(分支、循环程序)

1.分支结构原理 分支结构是汇编语言中的一种基本控制结构&#xff0c;它允许程序根据条件选择执行不同的路径。分支结构通常通过跳转&#xff08;jump&#xff09;指令来实现。 条件判断&#xff1a; 汇编语言中的条件判断通常通过比较&#xff08;compare&#xff09;指令来实…...

汽车损坏识别检测数据集,使用yolo,pasical voc xml,coco json格式标注,6696张图片,可识别11种损坏类型,识别率89.7%

汽车损坏识别检测数据集&#xff0c;使用yolo&#xff0c;pasical voc xml&#xff0c;coco json格式标注&#xff0c;6696张图片&#xff0c;可识别11种损坏类型损坏&#xff1a; 前挡风玻璃&#xff08;damage-front-windscreen &#xff09; 损坏的门 &#xff08;damaged-d…...

python的urllib模块和http模块

1.python的urllib库用于操作网页&#xff0c;并对网页内容进行处理 urllib包有如下模块&#xff1a; urllib.request&#xff1a;打开和读取URL urllib.error&#xff1a; 包含urllib.request抛出的异常 urllib.parse&#xff1a; 解析URL urllib.robotparser&#xff1…...

Codigger集成Copilot:智能编程助手

在信息技术的快速发展中&#xff0c;编程效率和创新能力的提升成为了开发者们追求的目标。Codigger平台通过集成Copilot智能编程助手&#xff0c;为开发者提供了一个强大的工具&#xff0c;以增强其生产力、创新力和技能水平。本文将深入探讨Codigger与Copilot的集成如何为IT专…...

快递物流查询API接口推荐

针对快递物流查询API接口及行政区划解析的需求&#xff0c;以下是一些推荐和解析&#xff1a; ### 一、快递物流查询API接口推荐 1. **ShowAPI** * **功能**&#xff1a;支持国内外1500快递物流公司的物流跟踪服务&#xff0c;包括顺丰、圆通、申通、中通、韵达等主流快递公司…...

【Unity3D】3D渲染流水线总结

3D渲染流水线&#xff1a; CPU阶段&#xff08;应用阶段&#xff09;&#xff1a; 1、加载数据&#xff1a;硬盘->内存->显存 场景数据从硬盘HDD加载到内存RAM&#xff0c;网格和纹理等数据会再次加载到显存VRAM&#xff0c;显卡对显存访问速度更快。 2、设置渲染状态…...

LevelDB 源码阅读:利用 Clang 的静态线程安全分析

LevelDB 中有一些宏比较有意思&#xff0c;平时自己写代码的时候&#xff0c;还基本没用过。这些宏在 thread_annotations.h 中定义&#xff0c;可以在编译时使用 Clang 编译器的线程安全分析工具&#xff0c;来检测潜在的线程安全问题。 比如下面这些宏&#xff0c;到底有什么…...

不只是工具:ChatGPT写作在学术中的创新思维与深度思考

目录 1.数据选择与质量 2.Prompt技巧 1.明确任务 2.上下文信息 3.好的示例 3.后期编辑与润色 随着AIGC技术的迅猛发展和不断升级&#xff0c;AI写作正逐渐成为各行各业的新宠。然而不少宝子们们却发现了一个有趣的现象&#xff1a;虽然都是依赖AI生成文本&#xff0c;有些…...

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(for循环语句)(八continue语句和break语句)

在C中&#xff0c;continue语句和break语句都是用于控制循环的执行流程的关键字&#xff0c;但它们有不同的用途和行为。 1、break语句用于立即终止当前所在的循环或switch语句&#xff0c;并跳出循环体&#xff0c;继续执行循环之后的代码&#xff0c;break语句用于直接跳出循…...

sql server 动态执行sql

实例&#xff1a; execute sp_executesql Nselect count(1) FROM table X2 WITH(NOLOCK) WHERE X2.UPDDTTM > DT_START AND X2.UPDDTTM < DT_END , NDT_START datetime,DT_END datetime, DT_START2025-01-02 10:06:58.620,DT_END2025-01-02 10:09:35.457 参考&…...

【数据结构Ⅰ复习题】

如有错误欢迎指正&#xff0c;题目根据教材----------严蔚敏数据结构&#xff08;c语言版 第2版&#xff09;人民邮电电子版 数据结构Ⅰ复习题 一、填空题1&#xff0e;算法应该具备的5个重要特性有___有穷性___、确定性、可行性、输入和输出。2&#xff0e;非空单链表L中*p是头…...

经验证:将数据从索尼传输到Android的 4 种方法

概括 像Android Galaxy S20 这样的新型Android智能手机很酷&#xff0c;但除了将数据从索尼传输到Android之外。众所周知&#xff0c;旧的索尼手机上存储着大量的文件&#xff0c;因此将数据从旧的索尼手机传输到新的Android手机非常重要。为了解决这个问题&#xff0c;我们做…...

服务器端请求伪造之基本介绍

一.服务器端请求伪造漏洞基础 1.客户端请求 客户端请求指的是由客户端设备&#xff08;如个人计算机、智能手机、平板电脑等&#xff09;或软件&#xff08;浏览器、各种APP&#xff09;发出的请求&#xff0c;以获取指定的网页、图片、视频或其他资源。比如当用户在浏览器中输…...

Java反射详解(三)

上一篇博客&#xff1a;Java反射详解&#xff08;二&#xff09; 写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.c…...

HTML——59. maxlength和disabled属性

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>maxlength和disabled属性</title></head><body><!--input元素的type属性&#xff1a;(必须要有)1.指定输入内容的类型2.默认为text,单行文本框--> …...

Java中的函数式接口详解(一)

1. 函数式接口 1.1. 定义 函数式接口&#xff08;Function Interface&#xff09;就是一个有且仅有一个抽象方法&#xff0c;但是可以有多个非抽象方法的接口。 函数式接口又称为&#xff1a;功能接口。 功能接口为 Lambda 表达式和方法引用(用双冒号 ::来进行方法调用)提供…...

Quo Vadis, Anomaly Detection? LLMs and VLMs in the Spotlight 论文阅读

文章信息&#xff1a; 原文链接&#xff1a;https://arxiv.org/abs/2412.18298 Abstract 视频异常检测&#xff08;VAD&#xff09;通过整合大语言模型&#xff08;LLMs&#xff09;和视觉语言模型&#xff08;VLMs&#xff09;取得了显著进展&#xff0c;解决了动态开放世界…...

redis的学习(二)

4 哈希表 哈希类型中的映射关系通常称为field-value&#xff0c;⽤于区分Redis整体的键值对&#xff08;key-value&#xff09;&#xff0c; 注意这⾥的value是指field对应的值&#xff0c;不是键&#xff08;key&#xff09;对应的值&#xff0c; 4.1 操作命令 hset&#xff…...

简单使用linux

1.1 Linux的组成 Linux 内核&#xff1a;内核是系统的核心&#xff0c;是运行程序和管理 像磁盘和打印机等硬件设备的核心程序。 文件系统 : 文件存放在磁盘等存储设备上的组织方法。 Linux 能支持多种目前浒的文件系统&#xff0c;如 ext4 、 FAT 、 VFAT 、 ISO9660 、 NF…...

springboot541党员学习交流平台(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统党员学习交流平台信息管理难度大&#xff0c;容错率低&am…...

心力衰竭相关临床记录数据分析开发技术概述

心力衰竭相关临床记录数据分析开发技术概述 心力衰竭临床记录数据分析的开发涉及多种技术&#xff0c;包括数据采集、处理、建模和可视化等方面。以下是从技术角度对整个开发流程的概述&#xff1a; 数据采集技术 1.1 数据来源 公开数据集&#xff1a;如 UCI 数据存储库、Clin…...

SpringMVC(六)拦截器

目录 1.什么是拦截器 2.拦截器和过滤器有哪些区别 3.拦截器方法 4.单个拦截器的执行流程 5.使用拦截器实现用户登录权限验证&#xff08;实例&#xff09; 1.先在html目录下写一个login.html文件 2.在controller包下写一个LoginController文件 3.加拦截器 1.创建一个conf…...

将simpletex 识别的公式 复制到ppt 中

1&#xff09;点击 复制MathML(word) 2&#xff09;右击粘贴到任意word 中 3&#xff09;将word公式粘到 office (2019) 的ppt 中 线上识别链接&#xff1a;SimpleTex - Snip & Get!...