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

云南微网站开发网站诊断书

云南微网站开发,网站诊断书,哪里可以买链接网站,济南市住房城乡建设网文章目录 版权声明修复问题内存溢出问题分类 分页查询文章接口的内存溢出问题背景解决思路问题根源解决思路 Mybatis导致的内存溢出问题背景问题根源解决思路 导出大文件内存溢出问题背景问题根源解决思路 ThreadLocal占用大量内存问题背景问题根源解决思路 文章内容审核接口的… 文章目录 版权声明修复问题内存溢出问题分类 分页查询文章接口的内存溢出问题背景解决思路问题根源解决思路 Mybatis导致的内存溢出问题背景问题根源解决思路 导出大文件内存溢出问题背景问题根源解决思路 ThreadLocal占用大量内存问题背景问题根源解决思路 文章内容审核接口的内存问题问题背景设计1Async异步审核存在问题设计2生产者消费者模式存在问题设计3Mq消息队列模式问题根源和解决思路 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用并非商业用途。我在整理学习笔记的过程中尽力确保准确性但无法保证内容的完整性和时效性。本博客的内容可能会随着时间的推移而过时或需要更新。若您是黑马程序员或相关权利人如有任何侵犯版权的地方请您及时联系我我将立即予以删除或进行必要的修改。对于其他读者请在阅读本博客内容时保持遵守相关法律法规和道德准则谨慎参考并自行承担因此产生的风险和责任。本博客中的部分观点和意见仅代表我个人不代表黑马程序员的立场。 修复问题 内存溢出问题分类 修复内存溢出问题的要具体问题具体分析问题总共可以分成三类 代码中的内存泄漏 解决方案完善代码 并发引起内存溢出 参数不当 由于参数设置不当比如堆内存设置过小导致并发量增加之后超过堆内存的上限。解决方案调整参数下一章中详细介绍 并发引起内存溢出 – 设计不当 系统的方案设计不当比如从数据库获取超大数据量的数据、线程池设计不当、生产者-消费者模型消费者消费性能问题解决方案优化设计方案 分页查询文章接口的内存溢出 问题背景 背景小李负责的新闻资讯类项目采用了微服务架构其中有一个文章微服务这个微服务在业务高峰期出现内存溢出的现象 解决思路 服务出现OOM内存溢出时生成内存快照使用MAT分析内存快照找到内存溢出的对象尝试在开发环境中重现问题分析代码中问题产生的原因修改代码测试并验证结果 MAT使用技巧从线程对象入手找到当前的处理器方法再右键选择处理器方法的outgoing references即可快速找到当前线程执行的方法。 问题根源 文章微服务中的分页接口没有限制最大单次访问条数并且单个文章对象占用的内存量较大在业务高峰期并发量较大时这部分从数据库获取到内存之后会占用大量的内存空间。 解决思路 与产品设计人员沟通限制最大的单次访问条数分页接口如果只是为展示文章列表不需要获取文章内容可以大大减少对象的大小在高峰期对微服务进行限流保护 Mybatis导致的内存溢出 问题背景 小李负责的文章微服务进行了升级新增加了一个判断id是否存在的接口第二天业务高峰期再次出现了内存溢出小李觉得应该和新增加的接口有关系 堆内存快照情况如下 问题根源 Mybatis在使用foreach进行sql拼接时会在内存中创建对象如果foreach处理的数组或者集合元素个数过多会占用大量的内存空间 解决思路 限制参数中最大的id个数将id缓存到redis或者内存缓存中通过缓存进行校验 导出大文件内存溢出 问题背景 小李负责的一个管理系统使用的是k8s将管理系统部署到容器中这个管理系统支持几十万条数据的excel文件导出。他发现系统在运行时如果有几十个人同时进行大数据量的导出会出现内存溢出。 问题根源 Excel文件导出如果使用POI的XSSFWorkbook在大数据量几十万的情况下会占用大量的内存。 解决思路 使用poi的SXSSFWorkbook(不推荐) GetMapping(/export)public void export(int size, String path) throws IOException {// 1 、创建工作薄Workbook workbook new XSSFWorkbook();// 2、在工作薄中创建sheetSheet sheet workbook.createSheet(测试);for (int i 0; i size; i) {// 3、在sheet中创建行Row row0 sheet.createRow(i);// 4、创建单元格并存入数据row0.createCell(0).setCellValue(RandomStringUtils.randomAlphabetic(1000));}// 将文件输出到指定文件FileOutputStream fileOutputStream null;try {fileOutputStream new FileOutputStream(path RandomStringUtils.randomAlphabetic(10) .xlsx);workbook.write(fileOutputStream);} catch (Exception e) {e.printStackTrace();} finally {if (fileOutputStream ! null) {fileOutputStream.close();}if (workbook ! null) {workbook.close();}}}hutool提供的BigExcelWriter减少内存开销推荐 //http://www.hutool.cn/docs/#/poi/Excel%E5%A4%A7%E6%95%B0%E6%8D%AE%E7%94%9F%E6%88%90-BigExcelWriterGetMapping(/export_hutool)public void export_hutool(int size, String path) throws IOException {ListList? rows new ArrayList();for (int i 0; i size; i) {rows.add( CollUtil.newArrayList(RandomStringUtils.randomAlphabetic(1000)));}BigExcelWriter writer ExcelUtil.getBigWriter(path RandomStringUtils.randomAlphabetic(10) .xlsx);// 一次性写出内容使用默认样式writer.write(rows);// 关闭writer释放内存writer.close();}使用阿里巴巴easy excel对内存进行大量的优化推荐 //https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write#%E9%87%8D%E5%A4%8D%E5%A4%9A%E6%AC%A1%E5%86%99%E5%85%A5%E5%86%99%E5%88%B0%E5%8D%95%E4%B8%AA%E6%88%96%E8%80%85%E5%A4%9A%E4%B8%AAsheetGetMapping(/export_easyexcel)public void export_easyexcel(int size, String path,int batch) throws IOException {// 方法1: 如果写到同一个sheetString fileName path RandomStringUtils.randomAlphabetic(10) .xlsx;// 这里注意 如果同一个sheet只要创建一次WriteSheet writeSheet EasyExcel.writerSheet(测试).build();// 这里 需要指定写用哪个class去写try (ExcelWriter excelWriter EasyExcel.write(fileName, DemoData.class).build()) {// 分100次写入for (int i 0; i batch; i) {// 分页去数据库查询数据 这里可以去数据库查询每一页的数据ListDemoData datas new ArrayList();for (int j 0; j size / batch; j) {DemoData demoData new DemoData();demoData.setString(RandomStringUtils.randomAlphabetic(1000));datas.add(demoData);}excelWriter.write(datas, writeSheet);//写入之后datas数据就可以释放了}}}ThreadLocal占用大量内存 问题背景 小李负责了一个微服务但是他发现系统在没有任何用户使用时也占用了大量的内存。导致可以使用的内存大大减少 问题根源 很多微服务会选择在拦截器preHandle方法中去解析请求头中的数据并放入一些数据到ThreadLocal中方便后续使用。 解决思路 在拦截器的afterCompletion方法中必须要将ThreadLocal中的数据清理掉。import com.itheima.jvmoptimize.practice.demo.common.UserDataContextHolder; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;/*** 拦截器的实现模拟放入数据到threadlocal中*/ public class UserInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {UserDataContextHolder.userData.set(new UserDataContextHolder.UserData());return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {UserDataContextHolder.userData.remove();} }文章内容审核接口的内存问题 问题背景 文章微服务中提供了文章审核接口会调用阿里云的内容安全接口进行文章中文字和图片的审核在自测过程中出现内存占用较大的问题 设计1Async异步审核 使用SpringBoot中的Async注解进行异步的审核 存在问题 线程池参数设置不当会导致大量线程的创建或者队列中保存大量的数据。任务没有持久化一旦走线程池的拒绝策略或者服务宕机、服务器掉电等情况很有可能会丢失任务 设计2生产者消费者模式 使用生产者和消费者模式进行处理队列数据可以实现持久化到数据库。 保存文章服务层实现代码Override public void saveArticle(ArticleDto article) {BUFFER_QUEUE.add(article);int size BUFFER_QUEUE.size();if( size 0 size % 10000 0){System.out.println(size);} }线程池配置代码Configuration EnableAsync public class ThreadPoolTaskConfig {public static final BlockingQueueArticleDto BUFFER_QUEUE new LinkedBlockingQueue(2000);private static final int corePoolSize 50; // 核心线程数默认线程数private static final int maxPoolSize 100; // 最大线程数private static final int keepAliveTime 10; // 允许线程空闲时间单位默认为秒private static final int queueCapacity 200; // 缓冲队列数private static final String threadNamePrefix Async-Service-; // 线程池名前缀Bean(taskExecutor)public ThreadPoolTaskExecutor getAsyncExecutor(){ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();executor.setCorePoolSize(corePoolSize);executor.setMaxPoolSize(Integer.MAX_VALUE);//executor.setMaxPoolSize(maxPoolSize);executor.setQueueCapacity(queueCapacity);executor.setKeepAliveSeconds(keepAliveTime);executor.setThreadNamePrefix(threadNamePrefix);// 线程池对拒绝任务的处理策略executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());// 初始化executor.initialize();return executor;} }审核文章代码Component public class ArticleSaveTask {AutowiredQualifier(taskExecutor)private ThreadPoolTaskExecutor threadPoolTaskExecutor;PostConstructpublic void pullArticleTask(){for (int i 0; i 50; i) {threadPoolTaskExecutor.submit((Runnable) () - {while (true){try {ArticleDto data BUFFER_QUEUE.take();/*** 获取到队列中的数据之后调用第三方接口审核数据但是此时网络出现问题* 第三方接口长时间没有响应此处使用休眠来模式30秒*/Thread.sleep(30 * 1000);} catch (InterruptedException e) {e.printStackTrace();}}});}} }存在问题 队列参数设置不正确会保存大量的数据。实现复杂需要自行实现持久化的机制否则数据会丢失 设计3Mq消息队列模式 使用mq消息队列进行处理由mq来保存文章的数据。发送消息的服务和拉取消息的服务可以是同一个也可以不是同一个 生产者代码 Autowired private RabbitTemplate rabbitTemplate; Autowired private ObjectMapper objectMapper;PostMapping(/demo3/{id}) public void article3(PathVariable(id) long id, RequestBody ArticleDto article) throws JsonProcessingException {article.setId(id);rabbitTemplate.convertAndSend(jvm-test,null, objectMapper.writeValueAsString(article)); }消费者代码Component public class SpringRabbitListener {RabbitListener(queues queue1,concurrency 10)public void listenSimpleQueue(String msg) throws InterruptedException {System.out.println(msg);Thread.sleep(30 * 1000);} }问题根源和解决思路 在项目中如果要使用异步进行业务处理或者实现生产者 – 消费者的模型如果在Java代码中实现会占用大量的内存去保存中间数据。尽量使用Mq消息队列可以很好地将中间数据单独进行保存不会占用Java的内存。同时也可以将生产者和消费者拆分成不同的微服务
http://www.dnsts.com.cn/news/76863.html

相关文章:

  • 深圳网站建设设计首选公司网站制作是不是要一个后台
  • 郑州网站seo个人网页主页
  • 乡村门户网站建设怎么做新网站的推广
  • 网站登录验证码不正确深圳seo爱好者
  • 为了加强公司网站建设中国外贸网站排名
  • 港海(天津)建设股份有限公司网站做pc端网站平台
  • 做自己的游戏网站餐饮营销方案
  • 承接app网站开发的广告wordpress 面向对象
  • 3d网页游戏排行seo最好的网站源码
  • 建筑八大员证报考网站wordpress 顶部白条
  • 一个网站绑定多个域名哪些网站用织梦默认模板
  • 哈尔滨建设银行网站首页网站维护入门教程
  • 机关网站模板承德市住房和城乡建设局官网
  • 兰州北京网站建设九江 网站建设公司
  • 官方网站开发需要几个技术人员会议网站
  • 题库网站建设的绩效指标汕头市住监局官网
  • 桐城市美丽乡村建设专题网站网站建设开题报告书
  • 公司想建个网站怎么弄wordpress管理面板忘记密码
  • 绍兴手机网站建设网站开发的论文
  • 5000做网站网站定制开发 广州
  • 响应式网站是做多大尺寸wordpress 仪表盘美化
  • wordpress网站邀请码自己制作的网站如何发布
  • 都江堰市网站建设招标信息网哪个比较好
  • 网站标题分隔符原阳网站建设
  • 备案号怎么添加到网站太原网站建设价格
  • 一流的低价网站建设网页游戏大厅在线玩
  • 盈利网站网站上传用什么软件做视频教程
  • 5g对网站建设的影响企业查询软件排行榜
  • 怎样免费网站建设为什么不能安装wordpress
  • 做网站建设的有哪些分销系统网站