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

Tomcat学习进阶

目录

  • Apache Tomcat
    • 架构配置
    • 线程模型
    • Tomcat 的类加载机制
      • 类加载器层次结构
      • 类加载流程
    • Tomcat 的优化策略
    • Tomcat 的集群部署
    • Tomcat故障排查

Apache Tomcat

在这里插入图片描述

架构配置

Apache Tomcat是一个开源的Java Servlet容器和Web服务器,它实现了Java EE规范中的Servlet和JSP API。

  1. Server:Server组件是整个Tomcat服务器的根元素,它包含一个或多个Service实例。Server负责管理生命周期事件,比如启动、停止以及服务器的正常运行状态。

  2. Service:Service组件包含一个或多个Connector和一个Engine。它定义了一种服务类型,通常对应HTTP服务,但也可以配置为其他类型的服务,如AJP连接器。

  3. Connector:Connector负责处理客户端请求并将它们转发给相应的Engine。它定义了如何监听端口以及如何接收和发送数据。常见的Connector类型包括HTTP/1.1和AJP。

  4. Engine:Engine是Service的核心部分,它代表一个虚拟主机,通常对应一个域名。Engine包含一个或多个Host对象,这些对象进一步细分应用程序的上下文。

  5. Host:Host代表一个虚拟主机,它可以映射多个Context路径。每个Host具有自己的配置,如别名、默认页面和错误页面。

  6. Context:Context表示一个Web应用程序的根,它封装了应用程序的特定信息,如Servlet映射、初始化参数和资源加载路径。

在这里插入图片描述

线程模型

线程模型是其性能和可伸缩性的关键部分

  1. 工作线程(Worker Threads):Tomcat 使用一个线程池来处理客户端请求。每个请求都会分配给线程池中的一个线程来执行。线程池的大小可以通过配置文件进行调整。

  2. 非阻塞 I/O(NIO):Tomcat 7 引入了 NIO 模型,它允许单个线程处理多个 I/O 操作,从而提高了并发处理能力。在 NIO 模型中,线程可以等待多个 I/O 事件,而不必为每个连接分配一个线程。

  3. 多路复用(Select):在 NIO 之前,Tomcat 使用了基于 select 的 I/O 模型,它允许线程同时监视多个 I/O 通道,当通道有数据可读或可写时,线程会被唤醒。

  4. 连接器(Connector):连接器是 Tomcat 与客户端进行通信的组件。每个连接器都有自己的线程池,用于处理特定类型的请求,例如 HTTP 请求或 AJP 请求。

  5. 执行器(Executor):Tomcat 8 引入了执行器的概念,它允许开发者自定义线程池的配置,包括线程池的大小、队列大小、线程存活时间等。

  6. 任务队列(Task Queue):当线程池中的线程都忙碌时,新的请求会被放入任务队列中等待处理。这有助于避免线程创建的开销,并确保请求被顺序处理。

  7. 可扩展性:Tomcat 的线程模型设计为可扩展的,可以通过增加服务器实例或调整线程池配置来处理更多的请求。

  8. 安全性:Tomcat 的线程模型也支持多种安全特性,确保线程在处理请求时能够安全地执行,例如通过线程隔离来防止潜在的安全漏洞。

在这里插入图片描述

Tomcat 的类加载机制

类加载机制确保了Web应用程序的类加载是相互隔离的,同时还允许一定程度的类共享。这种机制与传统的Java类加载机制(双亲委派模型)有所不同。

  1. 隔离性:每个Web应用程序都有自己的类加载器(WebAppClassLoader),确保了应用程序之间的类库是相互隔离的,避免了不同应用程序之间的依赖冲突。

  2. 灵活性:Web应用程序可以独立地进行重新部署,而不影响其他应用程序,因为每个应用程序都有自己的类加载器。

  3. 性能:由于每个Web应用程序都有自己的类加载器,因此在加载类时不需要搜索其他应用程序的Jar包,从而提高了性能。

  4. 共享:虽然每个应用程序都有自己的类加载器,但Tomcat仍然允许应用程序之间共享类库,例如通过SharedClassLoader。

类加载器层次结构

  • Bootstrap ClassLoader:Java启动类加载器,加载JDK的核心库。
  • System ClassLoader:通常加载Tomcat启动的类,如bootstrap.jar。
  • Common ClassLoader:加载Tomcat自身使用以及所有Web应用程序通用的一些类,位于CATALINA_HOME/lib目录下。
  • Catalina ClassLoader:加载Tomcat服务器内部使用的类,这些类对Web应用程序不可见。
  • Shared ClassLoader:加载Web应用程序共享的类,但对Tomcat自身不可见。
  • WebApp ClassLoader:每个Web应用程序都有一个唯一的类加载器,用于加载应用程序自己的类。

类加载流程

  1. WebAppClassLoader首先尝试在自己的/WEB-INF/classes目录或/WEB-INF/lib目录下的Jar文件中加载类。
  2. 如果未找到,它会委托给SharedClassLoader尝试加载。
  3. 如果SharedClassLoader也未找到,它会依次向上委托给CommonClassLoader、CatalinaClassLoader等。
  4. 如果所有类加载器都未能加载到请求的类,则抛出ClassNotFoundException
    在这里插入图片描述
    在这里插入图片描述

Tomcat 的优化策略

Tomcat优化可以从多个角度进行

  1. JVM参数调优:调整Java虚拟机的内存分配,包括初始堆大小(-Xms)、最大堆大小(-Xmx)、新生代大小(-Xmn)、线程栈大小(-Xss)等。选择合适的垃圾回收算法,如Serial、Parallel、CMS或G1。

  2. 连接器协议优化:Tomcat支持多种连接器协议,包括BIO、NIO和APR。APR提供了最好的性能,但需要安装额外的本地库。NIO提供了高并发处理能力,适用于大量短连接的场景。

  3. 配置文件优化:在server.xml中对<Connector>标签进行调整,包括设置网络连接超时(connectionTimeout)、禁用域名反查(enableLookups)、调整最大空闲线程数(maxSpareThreads)、设置请求队列长度(acceptCount)等。

  4. 线程管理优化:合理配置Tomcat的线程池参数,如最大线程数(maxThreads)、最小空闲线程数(minSpareThreads)等,以提高并发处理能力。

  5. 缓存和压缩策略优化:启用GZIP压缩(compression),设置压缩阈值(compressionMinSize)和压缩MIME类型(compressableMimeType),以减少网络传输数据量。

  6. 集群部署优化:通过负载均衡器如Nginx将请求分发到多个Tomcat实例,实现水平扩展,提高系统的处理能力。

  7. 字符集配置优化:确保Tomcat正确处理字符编码,避免乱码问题。可以通过设置系统属性如-Dfile.encoding=UTF-8来指定字符编码。

  8. 数据库连接池优化:如果Tomcat用于Web应用程序,优化数据库连接池参数,如最大连接数、最小空闲连接数等,可以显著提高应用程序性能。

  9. 静态资源处理优化:使用Nginx等反向代理服务器处理静态资源请求,减轻Tomcat负担。

  10. 监控和日志优化:开启Tomcat的监控功能,定期分析日志文件,及时发现并解决性能瓶颈。

在这里插入图片描述

Tomcat 的集群部署

  1. 准备工作:确保所有节点使用相同的Tomcat版本,并准备好所需的软件,包括JDK、Tomcat、Nginx(作为反向代理服务器)和mod_jk(Tomcat与Apache的连接器)。

  2. Tomcat配置

    • 解压并配置多个Tomcat实例,修改每个实例的端口号和配置文件,以避免端口冲突。
    • server.xml中为每个Tomcat实例配置<Engine>标签,设置jvmRoute属性,该属性值需与mod_jk中的worker名称一致。
  3. 开启Tomcat集群支持

    • 在每个Tomcat实例的server.xml中配置集群相关的<Cluster>元素,包括<Manager><Channel><Valve>等,用于管理会话复制和集群通信。
  4. Nginx配置(作为反向代理服务器):

    • 安装并启动Nginx。
    • 配置Nginx的nginx.conf文件,设置upstream定义服务器集群,并使用proxy_pass指令将请求转发到Tomcat集群。
  5. mod_jk配置

    • 将mod_jk安装到Apache,并在Apache的配置文件中加载mod_jk模块。
    • 配置workers.properties文件,定义Tomcat实例的属性,如端口、主机地址等,并设置负载均衡参数。
  6. 测试集群

    • 启动所有配置好的Tomcat实例和Nginx服务器。
    • 通过访问Nginx代理服务器来测试集群效果,验证请求是否能够在各个Tomcat实例间正确分配。
  7. Session复制(如果需要会话共享):

    • 在Tomcat的server.xml中配置集群的会话复制机制,使用<Cluster>元素的相关配置。
    • 确保应用程序的web.xml中包含<distributable/>元素,以支持集群部署。
  8. 安全性和优化

    • 配置SSL/TLS以保证数据传输安全。
    • 根据需要调整JVM参数、垃圾回收策略和Tomcat的线程池设置。
  9. 监控和维护

    • 使用工具监控集群性能和健康状况。
    • 定期检查日志文件,确保系统稳定运行。
      在这里插入图片描述

Tomcat故障排查

当遇到问题时,可以按照以下步骤进行排查

  1. 确认问题现象

    • 确定是访问速度慢、服务无响应、还是出现了错误信息。
  2. 查看日志文件

    • 检查Tomcat的日志文件,如catalina.outlocalhost.<date>.log等,这些文件通常位于<Tomcat安装目录>/logs下。
    • 检查Web应用的访问日志,通常位于<Tomcat安装目录>/logs/access.log
  3. 检查端口状态

    • 使用命令如netstat -an | grep <端口号>检查Tomcat端口是否被正确监听。
  4. 检查配置文件

    • 确认server.xmlweb.xml等配置文件没有错误,端口设置正确,没有遗漏必要的配置项。
  5. 资源使用情况

    • 检查服务器的CPU、内存、磁盘I/O等资源使用情况,确认是否有资源瓶颈。
  6. 线程和连接池状态

    • 使用Tomcat的管理界面或命令行工具jstack查看线程堆栈信息,分析是否有线程死锁或资源长时间占用。
    • 检查连接池(如数据库连接池)的状态,确认没有连接泄露。
  7. 垃圾回收日志

    • 如果怀疑是内存问题,可以查看JVM的垃圾回收日志,分析垃圾回收的频率和耗时。
  8. 部署问题排查

    • 检查Web应用的依赖是否正确部署,没有遗漏的库或资源文件。
  9. 安全配置

    • 检查是否有安全配置不当导致的访问问题,如防火墙设置、权限不足等。
  10. 网络问题排查

    • 如果怀疑是网络问题,可以ping服务器IP,使用traceroute跟踪路由,检查网络连通性。
  11. 集群状态

    • 如果是集群环境,检查各个节点的状态,确认负载均衡器正常工作,会话同步没有问题。
  12. 数据库问题

    • 如果应用依赖数据库,检查数据库服务是否正常,查询是否超时或死锁。
  13. 应用代码问题

    • 检查应用代码是否有bug,特别是新上线或最近修改的代码。
  14. 重启服务

    • 有时候,简单的重启Tomcat服务可以解决一些暂时性的问题。
  15. 使用诊断工具

    • 使用如JVisualVM、JProfiler等Java性能分析工具来帮助诊断问题。
  16. 搜索和社区帮助

    • 搜索是否有类似问题的解决方案,或在社区、论坛中寻求帮助。
  17. 更新和补丁

    • 确认Tomcat和应用的版本是否最新,是否有可用的补丁或更新可以解决问题。

故障排查是一个系统性的过程,需要根据具体情况灵活运用各种方法。在排查过程中,记录问题和解决方案对于预防未来的故障也非常有帮助。

相关文章:

Tomcat学习进阶

目录 Apache Tomcat架构配置线程模型Tomcat 的类加载机制类加载器层次结构类加载流程 Tomcat 的优化策略Tomcat 的集群部署Tomcat故障排查 Apache Tomcat 架构配置 Apache Tomcat是一个开源的Java Servlet容器和Web服务器&#xff0c;它实现了Java EE规范中的Servlet和JSP API。…...

【C++】————智能指针

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年8月20日 一&#xff0c;什么是智能指针 在C中没有垃圾回收机制&#xff0c;必须自己释放分配的内存&#xff0c;否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针&…...

GT IP中CC序列(Clock Correction Sequence)的周期性

CC序列&#xff08;Clock Correction Sequence&#xff09;&#xff0c;即时钟校正序列&#xff0c;在数字通信中扮演着至关重要的角色。这一序列的周期性插入机制&#xff0c;旨在确保发送器和接收器之间的时钟同步&#xff0c;从而维持数据传输的准确性和稳定性。以下是CC序列…...

grafana pod 无法启动 Only one datasource per organization can be marked as default

标题信息 helm 部署的 prometheus 全栈监控 chart 为 prometheus-community/kube-prometheus-stack helm 部署的 loki 日志系统 chart 为 grafana/loki-stack 问题描述 grafana pod 启动不了,查看该pod 日志报错如下 logger=provisioning t=2024-08-21T06:42:45.954318228…...

你是如何克服编程学习中的挫折感的?(-@-^-0-)

在编程学习中遇到挫折感是极为常见且正常的现象&#xff0c;因为编程往往涉及解决复杂问题、理解抽象概念以及不断试错的过程。 以下是一些建议&#xff0c;帮助你在面对挫折时调整心态&#xff0c;继续前行&#xff1a; 接受失败是成长的一部分&#xff1a;首先要认识到&#…...

大数据技术之Zookeeper(1)

目录 Zookeeper 入门 概述 Zookeeper的主要特点包括&#xff1a; Zookeeper的应用场景&#xff1a; Zookeeper的基本概念&#xff1a; 架构&#xff1a; Zookeeper工作机制 Zookeeper数据结构 Znode&#xff08;Zookeeper Node&#xff09; Znode的类型 Znode路径 Znode属性 Wa…...

鸿蒙学习(四):泛型空安全模块导入导出

泛型与函数 泛型类型和函数允许创建的代码在各种类型上运行&#xff0c;而不仅支持单一类型。 泛型类和接口(Element) 类和接口可以定义为泛型&#xff0c;将参数添加到类型定义中&#xff0c;如以下示例中的类型参数Element&#xff1a; class CustomStack<Element>…...

无人机(Unmanned Aerial Vehicle, UAV)视觉感知论文汇总

综述类 A Survey of Object Detection for UAVs Based on Deep LearningDeep Learning for UAV-based Object Detection and Tracking&#xff1a;A surveyMoving Target Tracking by Unmanned Aerial Vehicle&#xff1a;A Survey and TaxonomyVision-Based Learning for Dro…...

【ORACLE】 ORA-01691: Lob 段无法通过 8192 (在表空间 XXX_SPACE 中) 扩展

ORA-01691错误通常表示Oracle数据库在尝试扩展LOB段时无法为表空间分配更多的空间。这个问题通常由表空间容量不足引起。根据搜索结果&#xff0c;以下是几种可能的解决方案&#xff1a; 检查并扩大表空间&#xff1a;首先&#xff0c;确认表空间是否已经达到其最大容量。可以使…...

Java之静态代理与动态代理的区别

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f525; 微信&#xff1a;zsqtcyw 联系我领取学习资料 …...

公司内网监控软件有哪些?(2024年10款最新款推荐内网监控软件)

在2024年&#xff0c;公司内网监控软件市场提供了多种选择&#xff0c;以满足不同企业的监控需求。 以下是一些值得推荐的最新款内网监控软件&#xff1a; 1. Performance Monitor 核心功能&#xff1a;不仅是一款局域网监控软件&#xff0c;更是一个全面的内网安全管理解决方…...

CUDA编程07 - 卷积的优化

一:概述 在接下来的几篇文章中,我们将讨论一组重要的并行计算模式。这些模式是许多并行算法的基础,这些算法出现在许多并行应用中。我们将从卷积开始,卷积是一种流行的数组操作,广泛应用于信号处理、数字录音、图像处理、视频处理和计算机视觉等领域。在这些应用领域中,卷…...

解锁高效办公新姿势:SSO单点登录+企业网盘完美搭配

在现代互联网环境中&#xff0c;随着企业业务的不断扩展&#xff0c;多系统、多应用的集成成为常态。为了提升用户体验&#xff0c;减少用户在不同系统间切换的繁琐&#xff0c;单点登录&#xff08;SSO, Single Sign-On&#xff09;技术应运而生。 本文将详细介绍SSO单点登录的…...

[数据集][目标检测]竹子甘蔗发芽缺陷检测数据集VOC+YOLO格式2953张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2953 标注数量(xml文件个数)&#xff1a;2953 标注数量(txt文件个数)&#xff1a;2953 标注…...

RTC碰到LXTAL低频晶振停振怎么办?

GD32F303的RTC模块框图如下图所示&#xff0c;RTC时钟源可选择HXTAL/128、LXTAL或IRC40K&#xff0c;一般为了实现更精准的RTC时间&#xff0c;MCU系统均会外挂32.768KHz LXTAL低频晶振&#xff0c;但由于低频晶振负阻抗较大&#xff0c;不容易起振&#xff0c;若外部电路布线、…...

矩阵中的最大得分(Lc3148)——动态规划

给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格&#xff08;不必相邻&#xff09;。从值为 c1 的单元格移动到值为 c2 的单元格的得分为 c2 - c1 。 你可以从 任一 单元格开始&#xff0c;并且必须…...

C++ 设计模式(4. 建造者模式)

建造者模式&#xff08;也被成为生成器模式&#xff09;&#xff0c;是一种创建型设计模式&#xff0c;软件开发过程中有的时候需要创建很复杂的对象&#xff0c;而建造者模式的主要思想是将对象的构建过程分为多个步骤&#xff0c;并为每个步骤定义一个抽象的接口。具体的构建…...

Arbitrum 和 Optimism Layer 2 扩展方案对比

Arbitrum 和 Optimism 对比分析 Arbitrum 和 Optimism 是两个以太坊 Layer 2 扩展方案&#xff0c;它们都使用了 Optimistic Rollup 技术来提升以太坊的可扩展性并降低交易成本。虽然它们有着相似的目标&#xff0c;但在架构设计、性能表现和费用结构上各有特点。 一、架构与…...

热门的蓝牙耳机中,哪种类型更受欢迎?四款热度高的开放式耳机

在如今的耳机市场中&#xff0c;开放式耳机异军突起&#xff0c;成为了众多消费者的新宠。如果你还在为传统入耳式耳机带来的不适而烦恼&#xff0c;那么开放式耳机绝对值得你一试。它不仅能让你在享受音乐的同时&#xff0c;依然可以清晰感知周围环境&#xff0c;保障你的安全…...

基于web的亚热带常见自然林病虫害识别系统——总结与展望

文章目录 一、前言二、总结三、展望参考文献致谢一、前言 这个系列也迎来了结尾,最后说一些碎碎念… 二、总结 本文首先简要介绍了卷积神经网络的基本原理,以及在亚热带常见自然林植物识别领域的研究应用现状。 其重点研究了卷积神经网络在亚热带常见自然林植物叶片病害识…...

其他自动重试的注解

除了 Retryable 注解之外&#xff0c;Spring 提供了其他注解用于自动重试方法&#xff0c;主要包括以下几个注解&#xff1a; 1. Recover Recover 注解用于定义重试次数耗尽后执行的恢复方法。当 Retryable 注解的重试次数达到上限时&#xff0c;Recover 方法会被调用。这通常…...

宠物空气净化器哪款能吸毛?希喂、米家宠物空气净化器测评分享

养猫最令人困扰的&#xff0c;就是掉毛与难以彻底消除的异味&#xff0c;这两个问题就成了养猫生活中的一大挑战。每当换季或是猫咪自我梳理时&#xff0c;家中便被一层细腻的绒毛覆盖&#xff0c;从地板到沙发&#xff0c;从床单到衣物&#xff0c;甚至是空气中都漂浮着细小的…...

讲清前端开发(入门)

前端开发&#xff1a;创建用户在网页或应用程序中直接与之交互的部分。 简单来说&#xff0c;就是负责打造用户在使用网站、网页应用或者移动应用时直接看到和与之交互的部分。打个比方&#xff0c;前端开发就像是给房子做装修。房子的框架结构已经有了&#xff0c;但是需要有…...

深入理解MySQL索引:原理、数据结构与优化策略

深入理解MySQL索引&#xff1a;原理、数据结构与优化策略 MySQL 是当今最流行的开源关系型数据库管理系统之一&#xff0c;其强大的性能与灵活的可扩展性使得它广泛应用于各种规模的应用程序中。在数据库的日常操作中&#xff0c;索引起着至关重要的作用&#xff0c;能够极大地…...

mysql数据库基础使用

1、登录mysql ① 本地登录 mysql -u 用户名 -p ②远程登入 mysql -h ip主机地址 -P 端口号 -u 用户名 -p 回车输入密码即可. 2、关于用户操作 ①创建用户 % 代表所有ip都可以访问&#xff0c;可指定主机ip create user 用户名% identified by 密码; ②修改密码 alte…...

GATK AlleleList接口介绍

在 GATK(Genome Analysis Toolkit)中,AlleleList 接口是一个用来表示等位基因(alleles)列表的接口。Allele 是遗传学中用于表示某一特定基因座的不同形式的一个基本单位。AlleleList 接口定义了一些操作,使得处理和访问一组等位基因更加方便。 AlleleList 的实现类和继承…...

直播App遭受抓包后的DDoS与CC攻击防御策略

随着直播应用的普及&#xff0c;越来越多的用户开始依赖这些平台进行娱乐和社交活动。然而&#xff0c;这也使得直播平台成为网络攻击的目标之一。其中&#xff0c;DDoS&#xff08;分布式拒绝服务&#xff09;攻击和CC&#xff08;Challenge Collapsar&#xff0c;即HTTP慢速攻…...

【xilinx】 AXI Quad SPI IP - 如果 s_axi_wstrb 不等于 0xf,则寄存器可能无法正确更新

PG153 (v3.2) 规定如下&#xff1a; “AXI4-Lite 写访问寄存器由 32 位 AXI 写数据 (* _wdata ) 信号更新&#xff0c;并且不受 AXI 写数据选通 (* _wstrb ) 信号的影响。” "The AXI4-Lite write access register is updated by the 32-bit AXI Write Data (* _wdata ) s…...

【EPLAN】P8 2.9 使用不了ePLUSE

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决 EPLAN P8 2.9 使用不了ePLUSE问题 2、 问题场景 客户反应 EPLAN P8 2.9 版本打开后使用不了 ePLUSE 功能&#xff0c;如图 1 所示 EPLAN ePLUSE 界面为空白状态&#xff0c;无法使用。 图 1 3、软硬件环境 …...

页面设计任务 个人简介页面

目录 任务要求 任务讲解 源码: 详细讲解 html部分 CSS部分 任务要求 页面结构: 创建一个基本的 HTML 页面&#xff0c;页面标题为“我的个人简介”。页面内容分为以下四个部分&#xff1a; 顶部导航栏: 包含至少三个导航链接&#xff0c;例如&#xff1a;“主页”、“关于…...

专业b2c电商网站开发/百度高级检索入口

2020年10月18日上午9&#xff1a;00&#xff0c;华东交通大学第一届“职教杯”运动会暨“中铁市政环境杯”武术太极拳比赛在cuba馆隆重举行。本次比赛一共有来自机电与车辆工程学院等15个学院代表队的领队、教练员、运动员及裁判员、工作人员共350人参加&#xff0c;历时一天&a…...

那个公司建设网站/海口百度seo公司

Debug 和 Release 编译方式的本质区别 Debug 通常称为调试版本&#xff0c;它包含调试信息&#xff0c;并且不作任何优化&#xff0c;便于程序员调试程序。Release 称为发布版本&#xff0c;它往往是进行了各种优化&#xff0c;使得程序在代码大小和运行速度上都是最优的&a…...

网站建设与管理是哪个软件/站长之家最新域名查询

我为vlookup开发了代码但是我在处理错误时遇到了麻烦 . Sheet1上的列的值正在Sheet2的列中查找 . 结果显示在Sheet3上 .有2个实例会出现错误&#xff1a;如果查找值列中的单元格为空如果查找值不在表数组中如果查找值的单元格为空&#xff0c;我希望结果显示空白 . 如果查找值不…...

优美网站源码/哈尔滨百度推广联系人

目录 一、内存布局 二、ptmalloc内存管理器 1. 设计假设 2. 主分配区和非主分配区 3. chunk 内存块的基本组织单元 4. 内存分配malloc流程 5. 内存释放free流程 6. mallopt 参数调优 7. 使用注意事项 一、内存布局 了解ptmalloc内存管理器&#xff0c;就必须得先了解操…...

一舍设计公司/佛山seo培训

MPEG-2 专利池中的最后一个美国专利于 2018 年 2 月 14 日正式过期&#xff0c;除了不幸的菲律宾和马来西亚外&#xff0c;MPEG-2 编解码器不再受制于专利&#xff0c;无需再缴纳专利费。管理 MPEG-2 专利授权的组织 MPEGLA 如今正转向基因编辑技术 CRISPR。 摘自http://mini.e…...

网站直播用php怎么做/仿站定制模板建站

JavaScript非常值得我们学习。 1&#xff09;所有主浏览器都支持JavaScript. 2) 目前&#xff0c;全世界大部分网页都使用JavaScript. 3) 它可以使网页呈现各种动态效果。 4&#xff09;作为一个Web开发师&#xff0c;如果你想提供漂亮的网页、令用户满意的上网体验 &#xff0…...