`
ralphr
  • 浏览: 144083 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一次性能调优实战记录

阅读更多

1.起因
    前段时间在做一个消息平台的二期开发工作,该平台支持着某领域的不少重要应用,要求要有比较高的性能,但是在二期开发完成后的性能测试中出现比较严重的性能问题,其表现为响应速度时快时慢,TPS(每秒事物数)和请求响应时间成波动性,并且波动较大,低谷处TPS甚至降到10以下,高峰时可以达到60以上,因此决定查找性能问题,进行性能调优。本文将我调优的过程记录下来,分享给大家。

2.过程
2.1观察日志
    首先观察日志,查看在波动点上程序发生了什么。在日志中发现TPS低谷的那段时间处每秒的相应个数明显少了很多,再仔细看日志的打印并不是持续的,而是大概每隔1到2秒的时间系统就会卡住0.6秒左右的时间,排除这部分时间,系统处理速度还是比较快的,检查这段空闲时间的日志周围并没有太多的规律,执行的代码逻辑并不是非常固定,甚至在相邻两个get方法中间都会停止0.6秒,因此排除是这附近代码的问题,怀疑是内存的原因,在这段时间内进行了频繁的GC,从而影响了系统的处理速度。
2.2本机内存情况监控
    我的环境是linux java1.6u16 tomcat6,而服务器的环境是win server jdk1.4 resin,有一些不同,但还是要在本机调试比较方便,而且java1.6提供了比较好的内存监控工具jvisualvm可以方便的查看内存情况,其位置是在jdk的bin目录下面,双击运行。

    经过一番监控,发现并发测试开始后,堆内存不停的上涨,涨到接近堆内存最大值也基本不释放,保持一个超负荷状态,因此调高tomcat的内存分配为JAVA_OPTS='-Xms512m -Xmx1024m'‘默认好像是双128),但情况依旧,在内存堆积的时间段内系统响应速度变慢,不少时间都被用来执行GC,也就导致了LR测试所形成的波谷图形,此时如果执行jvisualvm的GC功能,内存立刻被大量回收,响应速度也立刻变快,TPS恢复到最大值,可以确认是有内存泄露无法正常回收,此时查看系统对象使用情况,发现系统的日志缓存对象LogObjectBean的个数不断增加,达到几百万个,从不被回收,因此可以确定是此类的内存泄露导致的。
2.3使用池技术减少大量日志对象生成的消耗
    日志模块为了减轻数据库的压力会缓存一部分LogObjectBean之后每隔一段时间一次性将日志写入数据库,因此有一部分日志对象未被回收是正常的,但是经过一番程序的调整后LogObjectBean的增加速度减慢但还是不停的涨,而日志模块的代码较繁琐,不好改。因此我决定使用池技术,将LogObjectBean使用后状态初始化,扔回到池中,后来的需要的日志对象也不需要new,而是直接从池中取得,如果不够的话池会自动新建,这里使用了apache commons pool,很容易的完成了这个逻辑,最终效果在100个并发下LogObjectBean稳定在6000个左右,不停的从池中借出,用完后再放回,这块就算稳定下来了,再经过一些JVM参数调整,在我的电脑上的短时间测试中,堆内存虽然会涨到95%左右,但大部分内存会在GC时立即回收,因此将程序移到服务器上做长期测试,但是很遗憾的是,服务器上效果依旧不好,只比调整前稍微好一点。
2.4JDK更换
    这时由于在我的电脑上效果还可以,而在服务器上效果比较差,因此怀疑是服务器上的低版本JDK可能GC的效果比较差导致的,所以将服务器的JDK版本改为1.6,这样也可以进行内存监控,但是启动时缺发现resin不支持jdk1.6,无法启动……换回jdk1.4后也可以用jdk1.6的jvisualvm监控,但是只能看到堆内存使用情况的图形,无法看到具体类的实例个数等信息。最终我决定更换更快的Jrockit JDK1.4.2,他提供更快的性能,并且有很好用的内存监控工具JMC。替换之后测试效果良好,TPS甚至提高到了90以上,图形虽然有个别低谷状态,但是波动很小。然而,并没有这样结束,失败的请求个数确大大增加了,而且都是在那一点低谷中批量失败的,这种情况每小时大约出现4到5次,经检查日志,发现这段时间resin自动重启了……
2.5使用JMC寻找内存泄露
    resin中没有显示出有内存溢出的日志,但是出现自动重启的原因应该是resin检测到内存使用达到一定限度的自我保护机制,而TPS的提高只能归功于JRocket出色的性能了,在接近堆内存最大值的情况下频繁GC依然保持系统的高速运转,确实是厉害。但是我们的程序还是有内存泄露的问题,要彻底解决才行。
    Jrocket安装好后会附带JMC,它是我见过的最好的内存监控工具,比jvisualvm以及JProfile都要好,而且BEA被Oracle收购后JMC的功能似乎已经没有使用限制了,而且许可也公开了出来,我这里是3.0版。

    使用JMC进行内存实例监控如上图。这是系统刚跑不久的实例情况,随着系统跑的越来越久前面几项都会不停的涨,GC掉的实例数非常少,也是内存泄露的原因所在,而LogObjectBean经过优化后偶尔会超过1W,大多数时候都保持在6100,不是内存泄露的原因。
    首先最前面的char[],byte[],String是jdk中的基本类,其中char和String实例个数是涨的最快的也是最多的,resin重启前char占了将近300M的内存空间,而且基本上实例个数差不多,涨幅也基本一致,也就是说char的增长大都由String泄露引起,虽然char占到了内存使用的40%,但是String才是char使用的根本原因,这个时候追踪String的使用情况,JMC可以轻易的监控一个对象被别的类引用的情况,以及被方法调用的情况。
    监控String的使用:

    从上图看出,开发人员自己写的一个BeanUtil的CopyBeanToBean方法生成了大量的String,达到了200多W个,检查这个方法,该方法是利用反射遍历SubMessage类里所有属性的get 方法,再invoke 遍历LogObjectBean的所有set方法给他赋值,生成新的日志对象,而SubMessage的属性有20个左右,每次都要执行subString方法截取方法名,加起来每次调用要生成将近40个String,每个String就是一个char[],执行该方法非常的消耗,而bean的拷贝已经有非常多成熟的工具,因此直接替换为apache commons-bean的PropertyUtils.copyProperties(logObj,subMessage);
    替换后的效果:

生成的String和char[]明显少了,然而,经过长时间的测试,内存还是有泄露现象,并没有解决根本问题。
    这时候注意到系统中最常用的SubMessage类,该类是对请求报文和结果报文的封装,如果该类没有被释放,自然会导致其内部大量的string和其他相关对象都不会被GC掉。
    彻底检查代码中SubMessage的使用,仔细检查过几遍后还是没有发现SubMessage有没释放掉的地方,只改掉一个多余的SubMessage的clone后再测试,问题依旧。
    这样,最不大可能不释放资源的类MessageDispatchThread,也就是业务逻辑主线程类,成了唯一的可能。
2.6问题锁定线程池
    照常理说,一个线程跑完后资源自然会释放,如果使用线程池的话,线程回到池中时也会释放掉之前使用的所有资源,因为他的run方法已经跑完了,而且我们使用的线程池是JDK5.0的并发包的前身也就是Doug Lea教授的并发包jdk1.4编译的版本,有着广泛的应用,应该不会有这么明显的线程执行完毕还资源不释放的bug。
    我在MessageDispatchThread的finally最后打印出“第N条线程执行完毕“的日志,日志里显示确实所有的线程都执行完毕了,再仔细检查线程池使用的代码,似乎也没有什么特别的,试着更改setKeepAlive方法,更改活动线程的存活时间似乎也没有用……
    然而将线程池的执行线程的方法去掉,直接让线程start,所有的问题都解决了,程序非常良好的运行,完全没有内存泄露情况出现,String和char[]也很好的被GC回收了。

    系统终于稳定了下来,但是不使用线程池还是会增加系统的开销,降低性能,因此还是要找出根本原因,这时候想到以前学习concurrent并发包的线程池的时候记得一句话:他的线程池可以执行实现了Runnable接口的线程,以前看他的源代码,入参是Runnable接口。确实,目前系统的线程池的使用与我之前的用法唯一不同就是MessageDispatchThread是继承自Thread实现的线程,而我以前写过的都是implements Runnable。虽然说继承Thread和实现Runnable得到的线程只是Thread提供了更多的功能,按理说运行机制应该没什么不同,但是我将MessageDispatchThread改为implements Runnable后,问题居然就解决了,也就是说继承Thread的线程,在交给jdk1.4并发包的线程池执行完毕后并没有被释放资源,而且也没被再利用,而是白白占着内存,导致内存泄露。导致这样的具体原因可以看下面的讨论http://www.iteye.com/topic/263928?page=1简单的说就是JDK1.5之前的Thread初始话的时候就会将自己添加到thread group中,在执行完start后再释放自己的资源,如果是执行他的run方法,那么就不会从thread group中拿掉,导致内存泄露,而Doug Lea的并发包里的线程池就是执行的线程的run方法。也难怪我本机的JDK1.6不会出现泄露。
3.总结:
    从JMC的第一张监控图上其实就可以看出MessageDispatchThread可能会有问题,但是一个线程在一个成熟的线程池管理下会出现泄露情况确实有些出乎意料,虽然走了些弯路,但是还是优化了其他相关模块的代码。
    最后调优的效果是在单台普通服务器上(或者说配置好一点的电脑)LR的100并发下TPS从60波动提高到了90以上稳定,300并发仍然可以290的TPS,500并发最高也能到450的TPS,极大的提高了系统性能

分享到:
评论

相关推荐

    DeepSeek与AI幻觉-清华大学团队制作

    DeepSeek与AI幻觉-清华大学团队制作 一、什么是AI幻觉 (定义与基础概念) 二、DeepSeek为什么会产生幻觉 (聚焦特定AI模型的幻觉成因分析) 三、AI幻觉评测 (评估AI幻觉的频率、类型与影响的方法) 四、如何减缓AI幻觉 (解决方案与技术优化方向) 五、AI幻觉的创造力价值 (探讨幻觉在创新场景中的潜在益处,如艺术生成、灵感激发等)

    协同过滤算法商品推荐系统(源码+数据库+论文+ppt)java开发springboot框架javaweb,可做计算机毕业设计或课程设计

    协同过滤算法商品推荐系统(源码+数据库+论文+ppt)java开发springboot框架javaweb,可做计算机毕业设计或课程设计 【功能需求】 前台用户可以实现注册登录、商品浏览,在线客服,加入购物车,加入收藏,下单购买,个人信息管理,收货信息管理,收藏管理,评论功能。 后台管理员可以进行用户管理、商品分类管理、商品信息管理、订单评价管理、系统管理、订单管理。 【环境需要】 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.数据库:MySql 5.7/8.0等版本均可; 【购买须知】 本源码项目经过严格的调试,项目已确保无误,可直接用于课程实训或毕业设计提交。里面都有配套的运行环境软件,讲解视频,部署视频教程,一应俱全,可以自己按照教程导入运行。附有论文参考,使学习者能够快速掌握系统设计和实现的核心技术。

    MES系统数字化工厂解决方案.pptx

    MES系统数字化工厂解决方案.pptx

    MUI调用照片以及裁剪和图库照片上传到服务器

    MUI调用照片以及裁剪和图库照片上传到服务器

    ChatGPT付费创作系统V3.1.3独立版 WEB端+H5端+小程序端 (新增DeepSeek高级通道+新的推理输出格式)

    GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序, 是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。这是一种基于人工智能技术的问答系统, 可以实现智能回答用户提出的问题。相比传统的问答系统,ChatGPT可以更加准确地理解用户的意图, 提供更加精准的答案。同时系统采用了最新的GPT3.5接口与GPT4模型,同时还支持型,文心一言,腾讯混元, 讯飞星火,通义千问,DeepSeeK,智普等等国内各种大模型,可以更好地适应不同的应用场景,支持站点无限多开, 可以说ChatGPT付费创作系统目前国内相对体验比较好的一款的ChatGPT及多接口软件系统。 新增接入DeepSeek-R1、DeepSeek-V3(Ollama自部署和第三方均支持)、高级通道增加DeepSeek、 支持AI接口输出的reasoning_content字段(新的推理输出格式)、更新模型库、修复导出Excel的bug等功能, 优化了云灵Midjourney接口,出图更快更稳定。小程序端变化不大该系统版本测试下来比较完美, 老版本升级时数据库结构同步下,同时把原来

    基于java的美食点餐管理平台设计的详细项目实例(含完整的程序,GUI设计和代码详解)

    内容概要:本文档详细介绍了一款基于Java技术的美食点餐管理平台的设计与实现。该平台旨在优化传统餐饮行业的服务流程,通过智能化的点餐系统、高效的订单处理、智能库存管理和数据分析等功能,为用户提供便捷高效的点餐体验,并提升餐厅管理效率和服务质量。系统涵盖了前端设计、后端开发、数据库设计等方面,采用了成熟的Java技术和现代Web开发框架,如Spring Boot、Vue.js或React,确保系统的高效性和稳定性。此外,文档还包括详细的用户界面设计、模块实现以及系统部署指南,帮助开发者理解和搭建该平台。 适合人群:具备一定的Java编程基础和技术经验的研发人员、IT从业者以及有意开发类似系统的企业和个人。 使用场景及目标:①为餐厅提供一个集点餐、订单处理、库存管理于一体的高效平台;②优化传统餐饮服务流程,提升客户服务体验;③利用大数据分析辅助决策,助力餐饮企业精细化运营;④通过集成多种支付方式和其他外部系统,满足多样化的商业需求。 其他说明:本项目不仅提供了完整的技术方案和支持文档,还针对实际应用场景提出了多个扩展方向和技术优化思路,旨在引导用户不断迭代和完善该平台的功能和性能。

    相场模拟与激光制造技术:选择性激光烧结、激光融覆中的凝固与枝晶生长研究,相场模拟与激光制造技术:选择性激光烧结、激光融覆及凝固过程中的枝晶生长研究,相场模拟 选择性激光烧结 激光融覆 凝固 枝晶生长

    相场模拟与激光制造技术:选择性激光烧结、激光融覆中的凝固与枝晶生长研究,相场模拟与激光制造技术:选择性激光烧结、激光融覆及凝固过程中的枝晶生长研究,相场模拟 选择性激光烧结 激光融覆 凝固 枝晶生长 ,相场模拟; 选择性激光烧结; 激光融覆; 凝固; 枝晶生长,相场模拟与激光工艺:枝晶生长的凝固过程研究

    基于ssh框架开发的厂区管理系统,集成增删改查功能。.zip

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行;功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    关于加强新能源汽车安全管理涉及的法规标准分析.pptx

    关于加强新能源汽车安全管理涉及的法规标准分析.pptx

    基于SSM的校园二手交易平台.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    机器学习课程设计——基于AdaBoost的银行用户逾期行为检测.zip

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行;功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    UI+svg+规范设置打包

    UI+svg格式

    关于乘用车燃料消耗量评价方法及指标强制性国家标准的分析.pptx

    关于乘用车燃料消耗量评价方法及指标强制性国家标准的分析.pptx

    openjpeg-1.5.1-18.el7.x64-86.rpm.tar.gz

    1、文件内容:openjpeg-1.5.1-18.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/openjpeg-1.5.1-18.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊

    FPGA Verilog实现BT656与1120视频协议组帧解帧代码详解:含文档介绍与仿真验证,FPGA Verilog实现BT656与1120视频协议组帧解帧代码详解:含文档介绍与仿真验证,fpga

    FPGA Verilog实现BT656与1120视频协议组帧解帧代码详解:含文档介绍与仿真验证,FPGA Verilog实现BT656与1120视频协议组帧解帧代码详解:含文档介绍与仿真验证,fpga verilog实现视频协议bt656和1120组帧解帧代码 有文档介绍协议,有mod仿真,matlab代码仿真 ,FPGA; Verilog; BT656协议; 1120组帧解帧代码; 文档介绍; Mod仿真; Matlab代码仿真,FPGA Verilog:实现BT656与1120组帧解帧代码的仿真与文档化研究

    基于 RAG 与大模型技术的医疗问答系统(毕设&课设&实训&大作业&竞赛&项目)

    基于 RAG 与大模型技术的医疗问答系统,利用 DiseaseKG 数据集与 Neo4j 构 建知识图谱,结合 BERT 的命名实体识别和 34b 大模型的意图识别,通过精确的知识检索和问答生成, 提升系统在医疗咨询中的性能,解决大模型在医疗领域应用的可靠性问题。.zip项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    基于 vue+elementUI+springboot 设计的 模仿'猪八戒'的服务外包平台.zip

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行;功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    抖音视频带货:行业趋势与营销策略.pptx

    抖音视频带货:行业趋势与营销策略.pptx

    西门子动态密码程序:学习随机码生成与指针存储数据,Smartline触摸屏操作指南及编程视频教程,西门子动态密码程序:学习随机码生成与存储数据的智能之旅(视频讲解),200smart动态密码程序,触摸

    西门子动态密码程序:学习随机码生成与指针存储数据,Smartline触摸屏操作指南及编程视频教程,西门子动态密码程序:学习随机码生成与存储数据的智能之旅(视频讲解),200smart动态密码程序,触摸屏是smartline,西门子动态密码程序,,随机码的产生,指针用法存储数据,非常适合学习,而且是自己程序,还专门录制了一段视频来讲解编程的思路和画面的操作步骤。 ,200smart动态密码程序; touchscreen: smartline; 西门子动态密码程序; 随机码生成; 指针用法存储数据; 自学编程; 程序录制视频讲解。,西门子动态密码程序:触摸屏Smartline随机码生成与指针存储技术解析

    基于Python+Django+Vue协同过滤电影推荐系统设计与实现.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

Global site tag (gtag.js) - Google Analytics