Tomcat 内核详解 - Web服务器机制
详细介绍
Apache Tomcat 是一个开源的Web服务器和Servlet容器,它实现了Java Servlet、JavaServer Pages (JSP) 和WebSocket规范。Tomcat的核心设计围绕着几个关键组件,它们共同构成了处理HTTP请求、管理Web应用部署和执行Servlet逻辑的基础架构。
Apache Tomcat,作为一款流行的开源Web服务器和Servlet容器,是许多Java Web应用程序的首选部署平台。它遵循Java Servlet、JavaServer Pages (JSP)、Expression Language和WebSocket规范,提供了一个强大而灵活的环境来运行Java Web应用。以下是Tomcat内核的几个核心组件及其工作原理的详细解析:
1. 连接器(Connectors)
连接器负责监听网络端口上的HTTP(或HTTPS)请求,并将这些请求转换为Tomcat内部能够处理的形式。Tomcat支持多种连接器类型,最常用的是基于Java NIO(非阻塞I/O)的org.apache.coyote.http11.Http11NioProtocol
和传统的阻塞I/O模型的org.apache.coyote.http11.Http11AprProtocol
(需要APR库支持)。连接器处理请求的生命周期包括接收、解码、响应编码和发送。
2. 协议处理器(Protocol Handlers)
连接器内部使用协议处理器来处理特定协议的请求,如HTTP/1.1。协议处理器将原始的Socket通信转换为Tomcat能够处理的Request对象,并在处理完成后生成Response对象。
3. 引擎(Engine)
引擎是连接器之上的一个层次,它代表了处理请求的顶级容器。引擎可以配置多个虚拟主机(Hosts),并负责将接收到的请求分配给适当的虚拟主机处理。
4. 虚拟主机(Hosts)
虚拟主机代表了运行在服务器上的一个逻辑Web服务器,每个Host可以有自己的应用部署、日志配置和文档根目录。在多租户或多个应用共享同一台物理服务器的情况下,虚拟主机提供了隔离和管理的便利。
5. 上下文(Contexts)
上下文代表了部署在Tomcat上的一个Web应用,是Tomcat处理请求的最小单位。每个上下文对应一个特定的Web应用,包括Servlet、JSP页面、静态资源等。每个上下文都有自己的部署描述符(WEB-INF/web.xml
),用于配置应用的初始化参数、Servlet映射等。
6. Servlet容器
Tomcat的Servlet容器负责Servlet的生命周期管理,包括装载、初始化、服务请求和销毁。它根据web.xml
中的配置来创建Servlet实例,并在接收到请求时调用相应的Servlet方法。
7. 类加载器(Class Loaders)
Tomcat为每个Web应用提供独立的类加载器,这有助于实现应用之间的隔离,允许不同应用使用相同类库的不同版本,同时也支持热部署和重载。
8. 线程池(Thread Pools)
Tomcat使用线程池来管理处理请求的工作线程,通过配置可以调整线程池的大小、超时等参数,以优化性能和资源利用率。
9. 安全组件
包括认证(Authentication)、授权(Authorization)和SSL/TLS支持,通过配置可以实现基本的Web应用安全防护。
Tomcat的内核设计围绕着高度模块化的组件,这些组件协同工作,为Java Web应用提供了一个高效、灵活且可扩展的运行环境。开发者可以通过配置这些组件来优化应用性能、管理资源、确保安全,以及实现复杂的应用部署架构。
使用场景
1. 开发与测试环境
- 快速原型开发:由于其轻量级和易部署的特性,Tomcat是开发新Java Web项目的理想选择。开发者可以迅速搭建开发环境,进行代码编写、调试和初步测试。
- 单元测试与集成测试:在持续集成/持续部署(CI/CD)流程中,Tomcat常被用作运行自动化测试的服务器,以验证应用的功能性和性能。
2. Web应用部署
- 企业内部系统:如CRM系统、ERP系统、企业门户等,这些系统通常面向企业内部用户,要求较高的安全性及稳定性,Tomcat凭借其良好的稳定性和扩展性成为首选。
- 电子商务网站:对于处理高并发交易、商品展示和用户管理等功能的电商网站,Tomcat配合合理的架构设计能够有效支撑业务需求。
- 内容管理系统(CMS):如WordPress(通过Java桥接技术)、Joomla等,虽然原生不是为Java设计,但通过特定插件或适配层,也能在Tomcat上部署和运行。
3. 微服务架构
- 微服务应用服务器:在微服务架构中,每个服务都可以独立部署和扩展。Tomcat因其轻量级,常被用作单个微服务的运行容器,便于管理和部署。
- API Gateway:虽然Tomcat主要用于Web应用,但在某些场景下,它也可以作为API网关,托管RESTful API服务,尤其是当这些API与Java后端服务紧密集成时。
4. 教育与学习
- 教学平台:在大学和在线课程中,Tomcat经常被用于教授Java Web开发的基础知识,因为它直接关联Java生态系统,且易于学生理解和操作。
- 实验环境:学生和初学者可以在虚拟机或本地安装Tomcat,实践Servlet、JSP、Spring MVC等技术的学习。
5. 云服务与容器化
- 云部署:在AWS、Azure、Google Cloud等云平台上,Tomcat可以轻松部署到云服务器或容器服务中,支持弹性伸缩和自动部署。
- Docker容器:Tomcat非常适合容器化部署,通过Docker镜像,应用可以快速、一致地在任何支持Docker的环境中运行。
6. 开源社区项目
- 开源软件:许多开源的Java Web应用选择Tomcat作为默认或推荐的运行环境,因为它的普及度和社区支持丰富。
实际开发中的使用详情
在实际开发中,Apache Tomcat的使用涉及多个方面,包括但不限于配置、部署、调试、性能调优和安全管理。以下是一些具体的操作和注意事项:
1. 安装与配置
- 下载安装:从Apache官方网站下载最新稳定版的Tomcat,解压即可使用,无需安装。
- 修改配置文件:主要配置文件包括
server.xml
(定义连接器、引擎、主机等)、web.xml
(全局Web应用配置)、context.xml
(上下文配置模板)。根据实际需求调整端口、连接器类型、JDBC资源、日志级别等。 - 环境变量设置:可选地,设置JAVA_HOME环境变量指向正确的Java安装路径,以确保Tomcat使用期望的JDK版本。
2. 应用部署
- 直接放置:将打包好的WAR文件直接放入
webapps
目录,Tomcat会自动解压部署。 - 管理界面:通过Tomcat的Web管理界面进行应用的部署、停止、重启和删除操作。
- 配置文件部署:在
conf\Catalina\localhost
目录下创建以应用名命名的XML文件,手动配置应用的上下文路径、参数等。
3. 日志管理
- 日志配置:修改
conf\logging.properties
来调整日志输出级别、格式和目标。 - 查看日志:Tomcat的日志文件通常位于
logs
目录下,包括catalina.out(主要日志)、localhost.*.log(本地主机日志)、manager.log(管理界面日志)等。
4. 性能调优
- 调整线程池:在
conf\server.xml
中,通过修改Executor
元素来调整线程池的大小、最大线程数、超时时间等。 - 优化连接器:调整连接器的参数,如最大连接数、接受缓冲区大小、NIO/NIO2/APR的选择等,以匹配应用需求和硬件资源。
- JVM调优:通过调整启动脚本中的JVM参数,如-Xms、-Xmx来优化内存分配,使用G1或ZGC垃圾收集器以提高响应速度。
5. 安全管理
- 用户权限:配置
conf\tomcat-users.xml
,定义管理、部署、监控等角色的用户及其权限。 - HTTPS配置:在
conf\server.xml
中配置SSL证书,启用HTTPS以加密通信。 - 限制访问:使用
conf\web.xml
中的security-constraint
标签来限制特定资源的访问。
6. 故障排查
- 查看日志:遇到问题时,首先检查日志文件,寻找错误信息或异常堆栈。
- 使用JMX监控:Tomcat支持JMX,可以远程监控和管理Tomcat的各项指标,如线程池状态、内存使用情况等。
- 分析线程堆栈:当应用挂起或响应缓慢时,使用
jstack
命令获取Java进程的线程堆栈信息,定位死锁或长时间运行的任务。
7. 开发工具集成
- IDE集成:大多数Java IDE(如IntelliJ IDEA、Eclipse)都支持与Tomcat集成,便于开发、调试和热部署。
- 持续集成:在CI/CD流程中,通过Maven或Gradle插件配置,自动化部署应用到Tomcat服务器。
注意事项
- 资源管理:确保应用资源(如数据库连接)得到正确管理和释放,避免内存泄漏。
- 并发和线程池配置:根据应用负载调整Tomcat的线程池大小,避免资源耗尽或响应慢。
- 安全性:关闭不必要的服务(如管理界面),配置SSL,定期更新Tomcat版本以修复安全漏洞。
优缺点
优点
- 开源免费:Tomcat作为Apache软件基金会的项目,是完全开源且免费的,降低了企业的部署成本。
- 轻量级:相比于其他重量级应用服务器(如WebLogic、WebSphere),Tomcat启动速度快,资源占用少,适合小型到中型项目。
- 易于部署和配置:Tomcat的安装和配置过程相对简单,通过修改几个配置文件就能满足大部分需求。
- 灵活性和可扩展性:支持多种连接器、自定义配置、JMX管理等,易于根据项目需求进行定制和扩展。
- 广泛的社区支持:拥有庞大的开发者社区,遇到问题时容易找到解决方案或技术支持。
- 良好的Java EE支持:虽然不如一些商业服务器全面,但Tomcat对Servlet、JSP、WebSocket等Java EE技术标准的支持足够满足多数应用需求。
- 容器化友好:Tomcat轻量级的特性使其很适合容器化部署,与Docker、Kubernetes等技术兼容性好。
缺点
- 管理界面简单:相较于商业服务器,Tomcat的管理界面功能较为基础,对于大规模部署和复杂管理需求可能不够用。
- 性能和稳定性:对于高并发、大流量的场景,虽然通过优化可以达到不错的表现,但相比于专为高负载设计的商业服务器,Tomcat在处理极端情况下的性能和稳定性可能略显不足。
- 缺乏高级特性:缺少一些商业服务器提供的高级功能,如集群管理、高级负载均衡、事务处理等。
- 安全配置:默认配置下,Tomcat的安全性较低,需要手动进行一系列安全加固,如禁用不安全的HTTP方法、配置HTTPS、限制访问等。
- JEE支持有限:虽然支持Servlet、JSP等核心标准,但对于完整的Java EE特性支持(如EJB、JMS)不如全面支持Java EE的服务器。
代码示例
Tomcat 部署及简单Servlet代码示例
1. 准备工作
首先,确保你已安装好Java开发环境(JDK)和Apache Tomcat服务器。本示例使用Tomcat 9作为演示环境。
2. 创建Servlet项目
使用IDE(如IntelliJ IDEA或Eclipse)创建一个新的Java Web项目,或者手动创建项目结构,至少需要以下结构:
myapp/|-- WEB-INF/|-- web.xml|-- src/|-- main/|-- java/|-- com.example.myapp/|-- MyServlet.java|-- webapp/|-- index.html
3. 编写Servlet代码
在MyServlet.java
中编写一个简单的Servlet类:
package com.example.myapp;import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.println("<h1>Hello from MyServlet!</h1>");out.println("<p>This is a simple servlet example.</p>");}
}
此Servlet会在接收到GET请求时,向浏览器返回一段简单的HTML信息。
4. 配置web.xml
在WEB-INF/web.xml
中配置Servlet的映射:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>MyServlet</servlet-name><servlet-class>com.example.myapp.MyServlet</servlet-class></servlet><servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping></web-app>
这段配置告诉Tomcat,当接收到以/hello
结尾的请求时,应该由MyServlet
来处理。
5. 部署应用
- 将项目打包成WAR文件(一般IDE有自动打包功能),然后复制到Tomcat的
webapps
目录下。 - 或者直接将项目目录(不打包)移动到
webapps
目录下,Tomcat会自动识别并部署。
6. 启动Tomcat并测试
- 启动Tomcat服务器。
- 打开浏览器,访问
http://localhost:8080/myapp/hello
(假设Tomcat运行在本地,端口为默认的8080)。
如果一切配置正确,你应该能看到Servlet响应的信息:“Hello from MyServlet!”和“这是一个简单的Servlet示例”。
注意事项
- 确保你的IDE或命令行中使用的Java版本与Tomcat兼容。
- 检查Tomcat的日志文件(通常位于
logs/catalina.out
),以获取启动和运行时的错误信息。- 在开发过程中,可以利用IDE的热部署功能来快速迭代Servlet代码,而无需每次修改后都重启Tomcat服务器。
可能遇到的问题及解决方案
在使用Apache Tomcat进行Web应用开发和部署的过程中,可能会遇到各种问题。以下是一些常见的问题及其解决方案:
1. 应用部署失败
问题:将应用部署到Tomcat时,发现应用没有启动,或者在访问时显示404错误。
解决方案:
- 检查
logs/catalina.out
文件,查看是否有详细的错误信息,如类找不到、配置错误等。 - 确认
web.xml
中的Servlet映射是否正确。 - 确保应用的WAR包已正确解压,且目录结构符合预期。
- 检查Tomcat的
server.xml
配置,确认端口没有冲突,应用的上下文路径是否正确配置。
2. 内存溢出
问题:应用运行一段时间后,Tomcat崩溃,日志中出现OutOfMemoryError
。
解决方案:
- 调整JVM参数,增加堆内存大小,例如
-Xms1024m -Xmx2048m
分别设置了最小和最大堆内存。 - 定期重启Tomcat服务,避免长时间运行积累内存泄漏。
- 使用工具(如VisualVM)进行内存分析,找出内存泄漏的原因并修复。
3. 性能问题
问题:在高并发访问下,Tomcat响应变慢,甚至超时。
解决方案:
- 调整连接器(Connector)配置,如增加最大线程数(
maxThreads
)、调整接受缓冲区大小(acceptCount
)。 - 使用异步Servlet或 Comet处理长连接,减少线程占用。
- 对应用进行性能分析,优化数据库查询、减少不必要的资源加载等。
4. 安全问题
问题:应用受到攻击,如SQL注入、跨站脚本攻击(XSS)等。
解决方案:
- 使用HTTPS,配置SSL以保护数据传输安全。
- 在
web.xml
中添加合适的过滤器,如防止XSS攻击的过滤器。 - 严格限制对管理界面的访问,设置强密码,使用安全的连接器配置(如禁用HTTP TRACE方法)。
5. 类加载冲突
问题:应用部署后,出现ClassNotFoundException或NoSuchMethodError等错误。
解决方案:
- 确认应用的类库是否与Tomcat自带的类库版本冲突,必要时更换或排除冲突的库。
- 检查应用的类加载器配置,确保应用间和Tomcat本身的类加载隔离。
6. 日志过多
问题:Tomcat产生的日志文件过大,磁盘空间紧张。
解决方案:
- 调整日志级别,减少不必要的日志输出。
- 设置日志滚动策略,如按时间或大小滚动日志文件,避免单个文件过大。
- 定期清理旧日志文件。
7. 端口占用
问题:启动Tomcat时提示端口已被占用。
解决方案:
- 使用
netstat -ano | findstr "端口号"
(Windows)或lsof -i :端口号
(Linux/Mac)查找占用端口的进程。 - 关闭占用端口的进程,或修改Tomcat的
server.xml
,使用其他未被占用的端口。
针对以上问题,持续监控Tomcat的运行状态,合理配置和优化,可以显著提升应用的稳定性和性能。
相关文章:

Tomcat 内核详解 - Web服务器机制
详细介绍 Apache Tomcat 是一个开源的Web服务器和Servlet容器,它实现了Java Servlet、JavaServer Pages (JSP) 和WebSocket规范。Tomcat的核心设计围绕着几个关键组件,它们共同构成了处理HTTP请求、管理Web应用部署和执行Servlet逻辑的基础架构。 Apac…...

几个人脸库对于面部动作识别的功能比较
经粗略研究,insightface只能识别面部特征点的位置,根据这些位置不能直接推出一个人是否在睡觉。 OpenFace 是一个高级的面部行为分析工具,它能够识别和分析多种面部动作单位(Facial Action Coding System, FACS),这些动作单位是根据面部肌肉活动定义的。每个动作单位(A…...

IDEA 使用Alibaba Cloud Toolkit 实现远程 自动部署
安装插件 maven方式部署 配置服务器主机信息 配置发布到主机 单击Select 单击run 就可以将选择module的jar文件上传到服务器的指定位置了 Alibaba Cloud Toolkit 上传文件的方式部署...

蓝桥杯备战15.完全二叉树的权值
P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using namespace std; #define endl \n #define int long long const int N 2e510; int a[N]; signed main() {std::ios::sync_with_stdio(0),cin.ti…...

【前端】LayUI监听事件汇总
一、监听单选按钮事件 点击资源类型单选按钮时,请求后台接口,把接口返回的内容追加到选择资源下拉框内 HTML <div class"layui-form-item"><label class"layui-form-label">资源类型:</label><d…...

【多电压流程 Multivoltage Flow】- 5.特定工具使用建议(1.VCS NLP VC LP)
本章提供了关于使用Synopsys工具进行低功耗设计和分析的信息。它包含以下部分: • 使用VCS NLP和VC LP进行多电压验证 • 使用Design Compiler进行逻辑综合 • 使用IC Compiler进行设计规划 • 使用IC Compiler进行物理实现 • 使用IC Compiler II和Fusion Compiler进行物…...

Elasticsearch 实现word、pdf、txt、excel文档内容快速检索(保姆级教程)
本文主要讲解ES如何从提取文档中提取内容(word、pdf、txt、excel等文件类型),实现快速检索文档内容实现。 特别说明一下,为什么用7.10.0版本,因为在项目中除了精确匹配的要求,也会有模糊查询(关…...

[初学rust] 04_rust复合类型
rust复合类型 字符串 由于rust的字符串元素类型是u8(1字节),但是字符类型是unicode(4字节) 索引不能像C那样读取又由于String类型和&str类型都是utf-8编码,中文占3字节切片可能会导致崩溃 slice(切片) 切片就是对String类型中的一部分的引用,它…...

什么是Zoho CRM客户关系系统管理?
以客户为中心的商业时代,卓越的客户体验已成为企业持续增长与成功的关键,为了在这场激烈的市场竞争中脱颖而出,企业需要一套强大、灵活且智能的客户关系管理系统——Zoho CRM应运而生,它不仅是管理客户信息的工具箱,更是驱动业务增…...

青岛东软载波子公司东软载波微电子授权世强硬创代理,出货量累计超20亿颗
凭借业内独特的互联网推新模式,世强先进(深圳)科技股份有限公司(下称“世强先进”) 获得本土工业MCU企业——上海东软载波微电子有限公司(下称“东软载波微电子”,英文:essemi&#…...

YOLO损失函数——SIoU和Focal Lossr损失函数解析
1. 概述 YOLO(You Only Look Once) 系列模型以其实时目标检测能力而闻名,其有效性在很大程度上归功于其专门设计的损失函数。在本文中,这里将深入探讨YOLO演进中不可或缺的各种YOLO损失函数,并重点介绍它们在PyTorch中…...

C++:编程世界的永恒之石
在编程的广袤领域中,C犹如一块永恒的基石,历经岁月的洗礼,依旧坚固而璀璨。它的深厚底蕴、强大功能和广泛的应用领域,使其成为无数程序员心中的信仰与追求。 一、C:历史与传承的交汇点 C的历史可追溯到上世纪80年代&…...

线上3D博物馆搭建简单吗?有何优势?有哪些应用场景?
随着科技的飞速发展,传统的博物馆参观方式正在经历一场前所未有的变革,在科技的“加持”下,不少博物馆凭借强大的技术、创意和美学实践,频频“出圈”,线上3D博物馆逐渐崛起,这不仅丰富了人们的文化体验&…...

Rust 语言的“命名空间” —— mod
在Rust中,虽然没有像C中的namespace这样的显式关键字,但是Rust通过模块(mod)系统提供了一种类似命名空间的功能。模块允许你将相关的代码组织在一起,并可以通过pub关键字来控制哪些项(如函数、结构体、枚举…...

加速科技突破2.7G高速数据接口测试技术
随着显示面板分辨率的不断提升,显示驱动芯片(DDIC)的数据接口传输速率越来越高,MIPI、LVDS/mLVDS、HDMI等高速数据接口在DDIC上广泛应用。为满足高速数据接口的ATE测试需求,作为国内少数拥有完全自研的LCD Driver测试解…...

从0开始搭建一个react项目 第一 二 三天
从0开始搭建一个react项目 今天接到一个任务让我把原来用ext.js写的前端换成react写的,我好慌的,因为我就是一个小白,之前只做过简单的二次开发功能。唉,我只是一个领着微薄薪水的小实习生,为什么要有这个任务&#x…...

LSTM与GAN创新结合!模型性能起飞,准确率超98%
今天来聊一个深度学习领域非常具有创新性的研究方向:LSTM结合GAN。 LSTM擅长处理和记忆长期的时间依赖关系,而GAN可以学习复杂的数据分布并生成逼真的数据样本。通过充分结合两者的优势,我们可以增强模型对复杂数据的处理能力,提…...

E2E测试学习
一、什么是E2E测试 e2e(end to end),也叫端到端测试,是一种用于测试应用程序流是否从头到尾按设计执行的方法。 执行端到端测试的目的是识别系统依赖关系,并确保在各种系统组件和系统之间传递正确的信息。端到端测试的目的是测试 整个软件的…...

基于死区补偿的永磁同步电动机矢量控制系统simulink仿真模型
整理了基于死区补偿的永磁同步电动机矢量控制系统simulink仿真,该模型使用线性死区补偿的PMSM矢量控制算法进行仿真,使用Foc电流双闭环 。 1.模块划分清晰,补偿前后仿真有对比,易于学习; 2.死区补偿算法的线性区区域可调; 3.自…...

GSCoolink GSV6125 替LT6711A HDMI2.0转Type-C/DP1.4
GSCoolink GSV6125 在 Type C/Dp monitor,线材,VR/AR,系统均有大量的应用机会,且目前只有龙迅LT6711A 竞争对手。 Gscoolink GSV6125是一款高性能、低功耗的HDMI 2.0转Type-C/DP1.4转换器。通过集成增强型微控制器,GS…...

【自然语言处理】【大模型】DeepSeek-V2论文解析
论文地址:https://arxiv.org/pdf/2405.04434 相关博客 【自然语言处理】【大模型】DeepSeek-V2论文解析 【自然语言处理】【大模型】BitNet:用1-bit Transformer训练LLM 【自然语言处理】BitNet b1.58:1bit LLM时代 【自然语言处理】【长文本…...

前端面试题日常练-day10 【面试题】
题目 希望这些选择题能够帮助您进行前端面试的准备,答案在文末。 1. 下面哪个CSS属性用于设置元素的字体样式? a) font-size b) font-color c) font-style d) font-weight2. 如何在JavaScript中判断一个变量的类型? a) typeOfb) getTypec)…...

conan2 基础入门(04)-指定编译器(gcc为例)
conan2 基础入门(04)-指定编译器(gcc为例) 文章目录 conan2 基础入门(04)-指定编译器(gcc为例)⭐准备生成profile文件预备文件和Code ⭐使用指令预览正确执行结果可能出现的问题 ⭐具体讲解conancmake ENDsettings.yml ⭐准备 生成profile文件 # 生成默认profile文件…...

谈谈std::map的lower_bound
我们知道std::map内部是一个红黑树,放到std::map里的数据等有一个能比较大小的方法。它相当于java里面的TreeMap。 它里面有个lower_bound方法,返回一个迭代器,它指向map里第一个大于等于参数的元素。 方法的签名很简单,但是在不同…...

不知道代理IP怎么挑?一文带你了解挑选的关键点!
IP代理在如今的网络环境中扮演者至关重要的角色。通过使用代理IP,可以增强用户个人信息和网络的安全。但想要挑选到适合自己的代理IP,并非是一件易事。今天就为大家带来挑选代理IP的关键注意点,帮你轻松筛选出最佳的选择。 稳定性与速度&…...

java 并发线程应用
java 并发线程相关 线程状态 新建(NEW): 创建后尚未启动。可运行(RUNABLE): 正在 Java 虚拟机中运行。但是在操作系统层面,它可能处于运行状态,也可能等待资源调度(例如处理器资源),资源调度完成就进入运行状态。所以该状态的可运行是指可以被运行,具体有没有运行要看底层…...

Java面试八股文(SpringCloud篇)
****************************************************...

PWRWER
编译烧录完代码之后,按下复位键屏幕会进行刷新,数据不会丢失 如果按下按键,进行页擦除,之后再按下复位键,发现屏幕不会再进行刷新,原因是程序已经被擦除,损毁,无法运行,此…...

怎样恢复E盘里删了的文件夹,2024让EasyRecovery来帮你轻松恢复
使用EasyRecovery易恢复进行数据恢复非常简单。首先,用户需要选择需要恢复的数据类型,如文档、图片、视频等。然后,软件会对选定的存储设备进行全面扫描,以寻找可恢复的数据。在扫描过程中,用户可以预览部分已找到的文…...

OSPF实验
需求: 1、R6为ISP只能配置IP地址,R1-R5的环回为私有网段。 2、R1/4/5为全连的MGRE结构,R1/2/3为星型的拓扑结构,R1为中心站点。 3、所有私有的网段可以互相通讯,私有网段使用OSPF协议完成。 第一步、搭建拓扑并按如…...