认知迭代:Tomcat性能提升的实战操作,提升60倍以上tomcat性能

2023-11-05

经常听到不少人说一句话:tomcat性能差,不如去用weblogicwebspherejboss”,我想说,用什么东西得根据实际情况来吧,如果给一个小公司的外包开发一个普通的项目,给她用OracleWeblogic?在高速公路上,拖拉机是没奔驰快,但是到了乡下,奔驰可就不行喽。看完本文,您将对tomcat的使用有个新的认识。

 

.影响性能的几个重要指标 

在开始动手优化小猫的性能之前,我们务必要先了解几个概念。

1.1吞吐量

吞吐量是指在一次性能测试过程中网络上传输的数据量的总和。

对于交互式应用来说,吞吐量指标反映的是服务器承受的压力,在容量规划的测试中,吞吐量是一个重点关注的指标,因为它能够说明系统级别的负载能力。另外,在性能调优过程中,吞吐量指标也有重要的价值。

1.2吞吐率

单位时间内网络上传输的数据量,也可以指单位时间内处理客户请求数量。它是衡量网络性能的重要指标,通常情况下,吞吐率用字节数/来衡量,当然,你可以用请求数/页面数/来衡量。其实,不管是一个请求还是一个页面,它的本质都是在网络上传输的数据,那么来表示数据的单位就是字节数。

 1.3事物

用户某一步或几步操作的集合。不过,我们要保证它有一个完整意义。比如用户对某一个页面的一次请求,用户对某系统的一次登录,淘宝用户对商品的一次确认支付过程,这些我们都可以看作一个事务。那么如何衡量服务器对事务的处理能力,又引出一个概念——TPS

1.4 TPS

每秒钟系统能够处理事务或交易的数量。

1.5点击率

点击率可以看做是TPS的一种特定情况,点击率更能体现用户端对服务器的压力,TPS更能体现服务器对客户请求的处理能力。

每秒钟用户向web服务器提交的HTTP请求数,这个指标是web应用特有的一个指标;web应用是请求-响应模式,用户发一个申请,服务器就要处理一次,所以点击是web应用能够处理的交易的最小单位。如果把每次点击定义为一个交易,点击率和TPS就是一个概念。容易看出,点击率越大,对服务器的压力也越大,点击率只是一个性能参考指标,重要的是分析点击时产生的影响。

需要注意的是,这里的点击不是指鼠标的一次单击操作,因为一次单击操作中,客户端可能向服务器发现多个HTTP请求。

1.6平均响应时间

也称为系统响应时间,它一般指在指定数量的VU情况下,每笔交易从mouseclickIE的数据刷新与展示之间的间隔,比如说:250VU下每笔交易的响应时间不超过2秒。

.我们要优化tomcat的目标

对以上几个性能方面的重要概念有了大致的了解后,我们要清楚优化tomcat的目标,我认为大体可以概括为2个目标:

1)承受更大并发用户数

2)性能方面取得大幅改善(系统平均性能提升至少20倍,甚至60倍)

. 从多方面来优化tomcat的性能

Tomcat的优化分为两块: JVM的优化,容器自身参数的优化。

3.1 JVM的优化

   3.1.1 32位操作系统和64位中JVM的比较

32位系统下JVM对内存的限制:不能突破2GB内存,即使在Win2003 Advanced Server下你的机器装有8GB-16GB的内存,而你的JAVA,只能用到2GB的内存,而在64位操作系统上无论是系统内存还是JVM都没有受到2GB这样的限制。

   3.1.2 tomcat启动行参数的优化

Tomcat首先跑在JVM之上的,因为它的启动其实也只是一个java命令行,首先我们需要对这个JAVA的启动命令行进行调优,本文是基于jdk 1.6环境。

Tomcat 的启动参数位于tomcat的安装目录\bin目录下,如果你是Linux操作系统就是catalina.sh文件,如果你是Windows操作系统那么你需要改动的就是catalina.bat文件。本文以linux环境为例来讲解,打开该文件,一般该文件头部是一堆的由##包裹着的注释文字,找到注释文字的最后一段。

 

敲入一个回车,加入如下的参数

export JAVA_OPTS="-server -Xms1400M-Xmx1400M -Xss512k

-XX:+AggressiveOpts-XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M-XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31

-XX:+UseConcMarkSweepGC -XX:+UseParNewGC-XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection-XX:LargePageSizeInBytes=128m

-XX:+UseFastAccessorMethods-XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "

参数解释:

-server

只要tomcat是运行在生产环境中的,这个参数必须加上。

tomcat默认是以一种叫java –client的模式来运行的,server即意味着你的tomcat是以真实的production的模式在运行的,这也就意味着你的tomcatserver模式运行时将拥有:更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机制,可以获得更多的负载与吞吐量。

 -Xms–Xmx

 JVM内存设置了,把XmsXmx两个值设成一样是最优的做法,有人说Xms为最小值,Xmx为最大值不是挺好的,这样设置还比较人性化,科学化。事实是如此吗?

大家想一下这样的场景:

一个系统随着并发数越来越高,它的内存使用情况逐步上升,上升到最高点不能上升了,开始回落,你们不要认为这个回落就是好事情,由其是大起大落,在内存回落时它付出的代价是CPU高速开始运转进行垃圾回收,此时严重的甚至会造成你的系统出现卡壳就是你在好好的操作,突然网页像死在那边一样几秒甚至十几秒时间,因为JVM正在进行垃圾回收。

因此一开始我们就把这两个设成一样,使得Tomcat在启动时就为最大化参数充分利用系统的效率,这个道理和jdbc pool里的minpool sizemaxpool size的需要设成一个数量是一样的原理。

如何知道我的JVM能够使用最大值啊呢?

在设这个最大内存即Xmx值时请先打开一个命令行,键入如下的命令:

 

如果是在32位系统下,我们试试2G内存行不行:

 

试试1700m

 

1700m都不可以,更不要说2048m了,2048m只是一个理论数值。这个跟机器也有关,有的能到1700m

 –Xmn

 设置年轻代大小为512m。整个堆大小=年轻代大小+年老代大小+ 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8

-Xss

是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程大约需要占用多少内存,可能会有多少线程同时运行等。一般不易设置超过1M,要不然容易出现out ofmemory

-XX:+AggressiveOpts

 启用这个参数,则每当JDK版本升级时,你的JVM都会使用最新加入的优化技术(如果有的话)。

-XX:+UseBiasedLocking

 启用一个优化了的线程锁,在我们的appServer,每个http请求就是一个线程,有的请求短有的请求长,就会有请求排队的现象,甚至还会出现线程阻塞,这个优化了的线程锁使得你的appServer内对线程处理自动进行最优调配。

-XX:PermSize=128M-XX:MaxPermSize=256M

JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64

在数据量的很大的文件导出时,一定要把这两个值设置上,否则会出现内存溢出的错误。

XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4

那么,如果是物理内存4GB,那么64分之一就是64MB,这就是PermSize默认值,也就是永生代内存初始大小;

四分之一是1024MB,这就是MaxPermSize默认大小。

-XX:+DisableExplicitGC

在程序代码中不允许有显示的调用”System.gc()”。看到过有两个极品工程中每次在DAO操作结束时手动调用System.gc()一下,觉得这样做好像能够解决它们的out ofmemory问题一样,付出的代价就是系统响应时间严重降低。

 -XX:+UseParNewGC

对年轻代采用多线程并行回收,这样收得快。

-XX:+UseConcMarkSweepGC

CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。

我们知道频频繁的GC会造面JVM的大起大落从而影响到系统的效率,因此使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,比如说使用了CMS GC后经过jprofiler的观察,GC被触发次数非常多,而每次GC耗时仅为几毫秒。

 -XX:MaxTenuringThreshold

设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。

这个值的设置是根据本地的jprofiler监控后得到的一个理想的值,不能一概而论原搬照抄。

-XX:+CMSParallelRemarkEnabled

在使用UseParNewGC 的情况下, 尽量减少mark的时间

-XX:+UseCMSCompactAtFullCollection

在使用concurrent gc的情况下, 防止memoryfragmention,live object进行整理, 使memory 碎片减少。

-XX:LargePageSizeInBytes

指定Java heap的分页页面大小。

-XX:+UseFastAccessorMethods

get,set 方法转成本地代码

-XX:+UseCMSInitiatingOccupancyOnly

指示只有在oldgeneration在使用了初始化的比例后concurrent collector启动收集

-XX:CMSInitiatingOccupancyFraction=70

CMSInitiatingOccupancyFraction,这个参数设置有很大技巧,基本上满足(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn就不会出现promotion failed。在我的应用中Xmx6000Xmn512,那么Xmx-Xmn5488兆,也就是年老代有5488兆,CMSInitiatingOccupancyFraction=90说明年老代到90%满的时候开始执行对年老代的并发垃圾回收(CMS),这时还10%的空间是5488*10%=548兆,所以即使Xmn(也就是年轻代共512兆)里所有对象都搬到年老代里,548兆的空间也足够了,所以只要满足上面的公式,就不会出现垃圾回收时的promotion failed

因此这个参数的设置必须与Xmn关联在一起。

-Djava.awt.headless=true

这个参数一般我们都是放在最后使用的,这全参数的作用是这样的,有时我们会在我们的J2EE工程中使用一些图表工具如:jfreechart,用于在web网页输出GIF/JPG等流,在winodws环境下,一般我们的appserver在输出图形时不会碰到什么问题,但是在linux/unix环境下经常会碰到一个exception导致你在winodws开发环境下图片显示的好好可是在linux/unix下却显示不出来,因此加上这个参数以免避这样的情况出现。

上述这样的配置,基本上可以达到:

1.系统响应增快

2. JVM回收速度增快同时又不影响系统的响应率

3. JVM内存最大化利用

4. 线程阻塞情况最小化

3.2 Tomcat容器内的优化

前面我们对Tomcat启动时的命令进行了优化,增加了系统的JVM可使用数、垃圾回收效率与线程阻塞情况、增加了系统响应效率等还有一个很重要的指标,我们没有去做优化,就是吞吐量。

打开tomcat安装目录\conf\server.xml文件,定位到这一行:

 

这一行就是我们的tomcat容器性能参数设置的地方,它一般都会有一个默认值,这些默认值是远远不够我们的使用的,我们来看经过更改后的这一段的配置:

 

又是一大坨。。。

解释一下:

URIEncoding=UTF-8

使得tomcat可以解析含有中文名的文件的url,真方便,不像apache里还有搞个mod_encoding,还要手工编译。

maxSpareThreads

maxSpareThreads 的意思就是如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数。

minSpareThreads

最小备用线程数,tomcat启动时的初始化的线程数。

enableLookups

这个功效和Apache中的HostnameLookups一样,设为关闭。

connectionTimeout

connectionTimeout为网络连接超时时间毫秒数。

maxThreads

maxThreads Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数,即最大并发数。

acceptCount

acceptCount是当线程数达到maxThreads后,后续请求会被放入一个等待队列,这个acceptCount是这个队列的大小,如果这个队列也满了,就直接refuse connection

maxProcessorsminProcessors

Java中线程是程序运行时的路径,是在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同的地址空间。多线程帮助程序员写出CPU大利用率的高效程序,使空闲时间保持最低,从而接受更多的请求。

通常Windows1000个左右,Linux2000个左右。

useURIValidationHack

对于这个参数,我们要看一下tomcat的一段源码再说。

 security

       if (connector.getUseURIValidationHack()) {

           Stringuri = validate(request.getRequestURI());

           if(uri == null) {

               res.setStatus(400);

               res.setMessage("Invalid URI");

               throw new IOException("InvalidURI");

           } else {

               req.requestURI().setString(uri);

               // Redoing the URI decoding

               req.decodedURI().duplicate(req.requestURI());

               req.getURLDecoder().convert(req.decodedURI(),true);

           }

       }

可以看到如果把useURIValidationHack设成"false"可以减少它对一些url的不必要的检查从而减省开销。

enableLookups="false"

为了消除DNS查询对性能的影响我们可以关闭DNS查询

disableUploadTimeout

类似于Apache中的keeyalive一样

compression="on"compressionMinSize="2048"             

compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

Tomcat配置gzip压缩(HTTP压缩)功能。

HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML,CSS,Javascript , Text,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGIPHP , JSP , ASP ,Servlet,SHTML等输出的网页也能进行压缩,压缩效率惊人。

1)compression="on" 打开压缩功能

2)compressionMinSize="2048" 启用压缩的输出内容大小,这里面默认为2KB

3)noCompressionUserAgents="gozilla,traviata" 对于以下的浏览器,不启用压缩

4)compressableMimeType="text/html,text/xml" 压缩类型

最后不要忘了把8443端口的地方也加上同样的配置,如果我们走https协议的话,我们将会用到8443端口这个段的配置,参数跟以上一样,这里就不再写出来了。

好了,我们的tomcat优化到这里就完成了,相信这样做下来,优化过的tomcat要比未经过优化的,性能提高20~60倍,有兴趣的童鞋可以照着做一下,顺便用LR或者ab测一下效果。

小猫飞起来了吗

为了简便,这里用轻量级测试工具Jmeter模拟150000个线程请求,试一下。

优化之前

 

优化之后

 

真变成飞猫了!

在生产环境可以结合apache也做次优化,如果再使用了负载均衡,那么系统的整体性能就更高了。

之前使用tomcat方面是不是弱爆了?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

认知迭代:Tomcat性能提升的实战操作,提升60倍以上tomcat性能 的相关文章

  • 设计模式(十四)责任链模式

    前面讨论了创建型模式 结构型模式 今天我们来讨论一下行为型模式 责任链模式 就是我们讨论的第一种行为型模式 责任链模式具体不容易说出来 但是如果看一看责任链模式的实际例子就很容易明白了 最典型的例子就是Java EE Servlet中的过滤
  • 新代数控系统参数说明书_台湾新代宏程序编程书

    点击右上角关注公众号 每天更新 其实说起来宏就是用公式来加工零件的 比如说椭圆 如果没有宏的话 我们要逐点算出曲线上的点 然后慢慢来用直线逼近 如果是个光洁度要求很高的工件的话 那么需要计算很多的点 可是应用了宏后 我们把椭圆公式输入到系统
  • Vue form表单input框 手动赋值 提交时 表单input值没有生效 验证仍然是空

    1 问题 input 赋值后表单提交却为空 代码如下
  • ECCV 2022

    论文 https arxiv org abs 2207 08134 https github com HaoruiSong622 Editing Out of Domain Editing Out of domain GAN Inversi
  • 云计算习题

    云计算 一 单选题 二 多选题 三 实操题 单选题 多选题 实操题 一 单选题 下面哪个是软件代码版本控制软件 B A project B SVN C notepad D Xshell 为满足金融业务的监管和安全要求 平台不需要考虑下列哪个
  • 百度PaddleOCR文字识别库下载安装保姆级教程

    文字目录 1 PaddleOCR是什么 2 特性 3 安装总流程 安装步骤在第四单元 1 首先安装PaddlePaddle库 深度学习框架 2 安装shapely库 依赖的库 3 安装PaddleOCR 要使用的库 4 安装步骤 win o
  • 十进制转二进制的方法

    import java util Scanner public class Demo01 public static void main String args Scanner input new Scanner System in Sys
  • 帮我生成一个 Python 爬虫code,浏览知乎上的浏览量,并将结果保存在CSV文件中...

    我可以为你提供一个简单的 Python 爬虫程序 可以用来浏览知乎上的浏览量 并将结果保存在 CSV 文件中 程序的代码如下 import requests import csv 定义知乎的 API 接口 url https www zhi
  • 【Linux】常见基本指令

    目录 1 ls指令 1 1 ls 1 2 ls l或 ll 1 3 ls a 1 4 ls d 1 5 ls i 1 6 ls n 1 7 ls F 1 8 ls R 2 pwd指令 3 cd指令 4 touch指令 5 mkdir 指令
  • onnxruntime 运行过程报错“onnxruntime::Model::Model Unknown model file format version“

    背景 这几天在玩一下yolov6 使用的是paddle框架训练的yolov6 然后使用paddl 转成onnx 再用onnxruntime来去预测模型 由于是在linux服务器上转出来 的onnx模型 并在本地的windows电脑上去使用
  • 希尔(Shell)排序 C++

    希尔排序是一个很有意思的排序算法 就是在选择不同的增量序列时算法的效率会有显著的不同 更有意思的是它和Dijkstra算法都有相似之后 就是刚发明的时候并不知道有那么厉害 特别是Dijkstra 自己都不知道自己发明的这个算法有没有用 希尔
  • 运算放大器分类及运算放大器参数说明

    运算放大器 我们在大部分情况下只了解运放简单的电路模型 而在很多场景中 并不是任何放大器都可以被直接拿过来应用 而是需要更加深入的了解运放的性能 那什么是性能呢 就是运放本身的参数 只有选择符合要求的运放 我们才能放大我们想要的信号 滤除我
  • 生命在于折腾——Obsidian笔记软件折腾记录(一)

    一 开端 我使用过很多笔记软件 OneNote 语雀 Notability GoodNotes 印象笔记 有道云笔记 不得不说 我一直想拥有一款满足以下条件的笔记软件 买断制 符合以下所有条件我考虑订阅 ipad可手写 icloud可同步
  • Cocos2dx——戏如人生(1)

    建立工程 cocos new game3 1 com cn wang l cpp d project 本人用的是cocos2dx 3 6 运行工程 Hello world helloworldscene h ifndef HELLOWORL
  • 使用DVWA进行XSS漏洞实战

    使用DVWA进行XSS漏洞实战 本文记录使用DVWA进行XSS漏洞实战的过程 跨站脚本 Cross Site Scripting XSS 是一种经常出现在 WEB 应用程序中的计算机安全漏洞 是由于 WEB 应用程序对用户的输入过滤不足而产
  • 区块链与分布式数据库的区别

    1 来源 分布式数据库 应对互联网条件下大规模数据的增删改查需求 解决传统数据库面临的通信开销大 性能差 容量可扩展性差和可靠性低的问题 通信开销大 假设只有一个数据库 并且放在北京 那么纽约的用户就需要等待网络从纽约到北京的往返通信延迟
  • 使用python写一个爬取百度前10条热搜

    import requests from bs4 import BeautifulSoup def get baidu hot url https top baidu com board tab realtime headers User
  • 宝塔面板如何部署静态网站?一分钟教会你最简单的方法

    宝塔面板如何部署静态网站 如果你有做好的静态网站源码 想要直接上传到宝塔面板 有的朋友可能不知道放在哪里 这里教大家一个最简单的方法 首先 一键部署好你的网站 这里用WordPress一键部署来举例 填写好你的网站信息 保存好数据库名和密码
  • 神经网络的过拟合是什么,神经网络过拟合的表现

    神经网络过拟合的现象是什么 发生原因 过拟合现象一般都是因为学习的过于精确 就好比让机器学习人脸 取了100个人的脸训练 但是由于你学习的过精确 导致除了这个样本100人外其他的人脸神经网络都认为不是人脸 实际我们只需要学习人脸的基本特征而
  • lstm时间序列预测+GRU(python)

    lstm时间序列预测 GRU python 1 数据分布 2 完整代码 3 实验结果 4 相关代码 4 1 GRU的修改 4 2 BiLSTM的修改 可以参考新发布的文章 1 BP神经网络预测 python 2 mlp多层感知机预测 pyt

随机推荐

  • 1、muduo网络库 ---- Linux平台下muduo编译安装

    muduo库的介绍 一个基于reactor反应堆模型的多线程C 网络库 作者是陈硕大神 muduo库是基于 boost 库开发的 所以需要在 Linux 平台上首先安装 boost 库 1 boost 库安装 1 编译源码安装 第一种方法是
  • Linux Nginx 配置 Thinkphp 两种方式

    第一种常见 前端vue后端Thinkphp接口以 api开头 这种Thinkphp不用启动 但是需要启动 php pfm 遇到的问题是我多个Thinkphp 项目在不同的目录 配置也是对应目录 但是不同域名访问接口 时都指向了第一个Thin
  • MQ--3 Message queuing)>>>>kafka

    MQ 1 Message queuing gt gt gt gt RabbitMQ MQ 2 Message queuing gt gt gt gt ZooKeeper 三 Kafka http kafka apache org 官网链接
  • windows的磁盘操作之二——初始化磁盘

    转载自 windows的磁盘操作之二 初始化磁盘 bunny技术坊的技术博客 51CTO博客 原文如下 上一节中我们介绍了一些基本概念和主要的API 本节开始我们将列举并分析一些实例 本文中的所有代码我都在vs2008下测试过 读者只需要替
  • Flutter使用C++

    总体 flutter通过dart语言和C 交互 dart的ffi包完成交互 ffi封装了c 的基本数据类型 包括结构体 和一些基本方法 我们可以直接在dart中访问c 的内存数据等 相对于jni更加直接 基本步骤 官方步骤 https do
  • 数据挖掘七种常用的方法汇总

    数据挖掘 Data Mining 就是从大量的 不完全的 有噪声的 模糊的 随机的实际应用数据中 提取隐含在其中的 人们事先不知道的 但又是潜在有用的信息和知识的过程 这个定义包括几层含义 数据源必须是真实的 大量的 含噪声的 发现的是用户
  • 将本地jar 批量发布到 Nexus 私服

    前言 在日常开发过程中 我们有遇到将项目依赖通过 mvn deploy 发布到自己的公司的私服 以便其他人 环境统一下载入口 但是也有一些特殊情况 比如只能拿到第三方 或甲方 的依赖jar 并拿不到源码 所以只能将jar 通过 mvn de
  • 有限域GF(2^8)内乘法代码实现以及原理

    在密码学中经常用到有限域的乘法 一般在AES中用到的是GF 2 8 有限域内乘法 什么是有限域呢 有限域通俗的讲就是函数的运算结果全都包含在一个域中 不同于实数域 有限域有一个最大值 所有超过这个最大值的数都会经过一定的方法使他回到这个域中
  • 主成份分析(PCA)详解

    主成分分析法 Principal Component Analysis 大多在数据维度比较高的时候 用来减少数据维度 因而加快模型训练速度 另外也有些用途 比如图片压缩 主要是用SVD 也可以用PCA来做 因子分析等 具体怎么用 看个人需求
  • Docker基础(1)—— Docker基本概念

    Docker基础 1 Docker基本概念 Docker基础 2 Docker安装及基础操作 关于docker是什么以及docker的教程网上有很多资料 GitBook上的Docker教程是比较官方和全面的 以下我结合手册的学习及在慕课网上
  • mini2440按键中断

    ARM中断控制系统 按键驱动程序设计 一 Arm中断控制系统 1 查询方式 程序不断地查询设备的状态 并做出相应的反应 该方式实现比较简单 常用在比较单一的系统中 比如 一个温控系统中可以实用查询的方式不断检测温度变化 特点 实现简单 但C
  • 操作系统——LRU算法以及置换次数、缺页数、缺页率计算

    目录 一 LRU是什么 二 LRU算法的规则 三 缺页 换页 四 计算页面置换次数 缺页数 一 LRU是什么 LRU 全称是Least Recently Used 即最近最少使用页面置换算法 从字面意思上可以看出 选择最近最久未使用的页面予
  • python猜硬币正反面_python 编写猜硬币小游戏

    猜硬币解法1 import random guess while guess not in 0 1 print 猜硬币游戏 print 猜一猜硬币是正面还是反面 guess int input 正面 请输入0 反面 请输入1 注意要用int
  • 【STM32】

    失败了也挺可爱 成功了就超帅 文章目录 前言 1 JTAG SWD引脚 2 禁用JTAG功能 2 1 标准库 2 2 HAL库 3 禁用SWD JTAG功能 3 1 标准库 3 2 HAL库 总结 前言 最近在画板子耍 我LED灯选用的 P
  • 当测试人员遇上CodeReview:揭秘代码审查绝招

    引言 测试人员的业务流程理解程度 直接影响测试用例的准确性和全面性 为了提高测试用例编写水平和测试效率 有两个关键方面需要注意 首先 通过仔细阅读需求文档并与产品经理进行充分沟通的方式可以达到这一目标 其次 通过进行代码审查来提高代码质量
  • matlab实现离散傅里叶变换及低通滤波

    如图传感器无滤波状态下FZ数据为下列 导入matlab使用工具箱分析图如下 将数据导入matlab代码 clear clc close all load data nofliter Fs 100 采集频率 T 1 Fs 采集时间间隔 信号长
  • c++对象模型探索-王健伟-专题视频课程

    c 对象模型探索 120人已学习 课程介绍 c 对象模型知识久负盛名 在c 界具有很高的美誉度 这方面知识的学习 更是被诸多颇具开发实力的行业前辈倾力推荐 本门课程内容将涉及到很多不被常人所知的 c 对象内部工作原理 底层的一些具体实现机制
  • 面试 -为啥react函数式组件无this?

    为什么函数式组件的this不指向window 因为这是经过Babel翻译的结果 Babel要将jsx语法翻译成js Babel是严格模式 use strict 下进行的 不允许函数里的this指向window 所以这里指向undefined
  • 飞浆AI studio人工智能课程学习(2)-Prompt优化思路

    文章目录 优化思路 上节课的例子 问题分析 思路解析 Prompt优化技巧 Prompt优化原理 十个技巧高效优化Prompt 迭代法 Trick法 工具法 通用技巧 定基础 通用技巧 做强调 需求强调怎么做 通用技巧 提预设 Trick法
  • 认知迭代:Tomcat性能提升的实战操作,提升60倍以上tomcat性能

    经常听到不少人说一句话 tomcat性能差 不如去用weblogic websphere jboss 我想说 用什么东西得根据实际情况来吧 如果给一个小公司的外包开发一个普通的项目 给她用Oracle Weblogic 在高速公路上 拖拉机