从开发者角度看Android 和 IOS的前景
闲弛现荚通过dump以及日志分析我们已经知道了问题代码所在就是使用easyexcel上传、解析文件开发同学没有做分页导致内存溢出。这点在easyexcel文档也有提到参见。内存溢出后触发频繁的full gc由于gc很难有效回收内存所以程序抛出了OutOfMemoryError原因是Java heap space。关于OOM的异常原因我们也需要知道有如下几种Java heap space内存无法分配新的对象。典型的场景是内存不足内存泄漏分配的对象过大。GC Overhead limit exceededgc回收异常多次发生了98%的时间用于gc但只回收2%的内存。典型的场景是内存不足内存泄漏。Metaspace元空间不足。典型的场景是元空间设置太小程序异常创建过多的Class。Direct buffer memory直接内存不足。典型的场景是直接内存设置太小直接内存泄漏。Unable to create new native thread无法创建新的线程。典型的场景是系统ulimit -u设置太小。Requested array size exceeds VM limi数组大小太大。典型的场景是new ClassA[Long.MAX_VALUE]CodeCachejit编译缓存溢出。典型的场景是jit缓存设置过小。注意我们上面提到问题的是内存溢出而不是内存泄漏两者有本质的区别。内存溢出通常是分配大对象应用内存不足通常分配多点空间就可以解决问题而且所占的内存用完还是可以被回收的。内存泄漏则是程序有问题内存是无法被回收的分配再多的空间也都会被慢慢消耗完。打个比方内存溢出只是人长得不好看不是坏人内存泄漏则长得不好看也是坏人。当然两者我们都需要对其进行优化。通过我们的观察也发现确实如此经过一段时间后文件解析数据处理完内存就被回收了也没有full gc了。但问题来了此时应用http请求还是继续报错的依然是connection reset by peer。这点就不好理解了应用恢复了为什么tomcat没有恢复tomcat线程此时在做什么从日志也看不到tomcat相关错误tomcat假死了。从监控上看挂掉之前tomcat的请求线程数和连接数没有什么波动。我们的两个核心问题是什么是connection reset by peertomcat线程此时处于什么状态连接报错我们搜索源码并没有抛出connection reset by peer的代码也就是可能是jvm层面的抛出或者系统层面的抛出。既然是跟connection相关那我们就用netstat命令看下当前进程的连接情况netstat -tlnp | grep 8100netstat -anp | grep 8100从输出可以发现有一个特殊的101我们用正常的进程看一般都是0。这个参数叫backlog表示连接等待队列的长度对应tomcat的acceptCount参数默认是100。当连接超过这个值时就会报connection reset by peer我们当前是101所以新来的请求就被拒绝了。tomcat线程模型对于第二个问题tomcat线程正在干什么。一般我们可以通过jstack pid导出线程堆栈分析不过当我们的服务运行一段时间例如好几天后执行jstackjmap都会报错似乎是某些信息被系统清除掉这点我还找到根本原因如果你知道答案请告知我一下。幸好有arthas我们可以通过thread命令查看线程和其堆栈信息。thread -n 10 #top 10 cputhread 1 #展示线程1的堆栈thread --all #展示所有线程thread --all | grep http #展示http线程我们可以看到tomcat的10个核心线程还是在的且处于waitting状态。处于waitting状态是因为它在等任务执行从堆栈可以看出是阻塞在TaskQueue.take方法org.apache.tomcat.util.threads.TaskQueue是tomcat中的LinkedBlockingQueue是生产者-消费者模型take方法阻塞表示当前队列是空的没有任务需要执行一旦有任务放入TaskQueuetake方法就会唤醒进入Runnable状态。这点就很奇怪了前面说连接队列都满了但tomcat任务队列确是空的执行线程都处于等待任务状态一边满载一边空闲。要搞清楚这个问题需要我们对tomcat线程模型有所了解。tomcat支持几种IO模型BIO、NIO、AIO(NIO2)、APR我们可以通过server.tomcat.protocol参数进行设置默认用的是NIONIO是一种同步非阻塞IO。NIO的核心目的是可以用少量线程处理大量连接在linux用select/poll/epoll实现。NIO在很多中间件都有应用kafka,redis,rocketmq,gateway等等可以说涉及到网络处理的都离不开NIO。AIO是真正的异步IO但Linux对其支持不够完善且NIO已经足够高效所以NIO用得最多。reactor模型如何更好的实现NIO是个问题就好像我们实现某个功能要用到设计模式一样reactor就是NIO一种实现模式。doug lee在scalable io in java总结了3种模型单reactor单线程整个过程由一个线程完成包括创建连接读写数据业务处理。redis 6.0以前的版本就是这种模式实现起来简单没有线程切换加锁的开销。缺点是单线程不能发挥多核cpu的优势如果有一个业务处理阻塞了那么整个服务都会阻塞。单reactor多线程接收连接(accept)和IO读写还是由一个线程完成但业务处理会提交给业务线程池业务处理不会阻塞整个服务。多reactor多线程接收连接由一个main reactor处理建立连接后将其注册到sub reactor上每个sub reactor都是单reactor多线程模式。tomcat的实现tomcat的NIO由3种线程实现分别是Acceptor线程、Poller线程、请求处理线程。对于请求处理线程池我们比较熟悉常用的两个参数server.tomcat.minSpareThreads 10server.tomcat.maxThreads 200对应到reactor模型可以看成它是一种多reactor多线程模型Acceptor线程负责建立连接然后将建立好的连接注册到Poller由Poller进行读写。Poller读写后创建请求将其交给请求处理线程池。Acceptor和Poller线程对应的run方法都是一个死循环源源不断的接收连接、读写连接。从reactor模型上看在多核cpu下多reactor多线程模型可以获得更高的效率但tomcat10以下默认只能有一个Acceptor和一个Poller线程。源码分析源码位置org.apache.tomcat.util.net.NioEndpoint#startInternal开启Acceptor线程和Poller线程源码位置org.apache.tomcat.util.net.Acceptor#runwhile循环建立连接源码位置org.apache.tomcat.util.net.NioEndpoint.Poller#runwhile循环读取数据源码位置org.apache.tomcat.util.net.AbstractEndpoint#processSocket将封装好的请求交给请求线程池处理关于tomcat线程池有一个点要注意它和jdk不一样的是它是先开启核心线程当任务超过核心线程数就继续开启至最大线程数如果还超过才进入等待队列。水落石出通过上面的分析让我们回到问题出现时的这张图可以看到Acceptor和Poller线程消失了这样我们现象就很好解释了Acceptor没有拿新的连接来处理了此时连接在系统层面积压tomcat请求处理线程空闲。我们重启后再执行一下thread命令正常的是从Acceptor源码上看它捕获了异常但对于OOM选择重新抛出Acceptor线程就中断了可见OOM对于tomcat来说是个致命异常一旦程序有此类报错需要优化否则可能导致整个服务异常。且Acceptor和Poller线程抛出这个位置在打印日志之前所以也看不到错误日志这点似乎不太好但最新的tomcat版本也是保持如此。如果要获得这个日志我们也可以通过Thread的全局异常来捕获Thread.setDefaultUncaughtExceptionHandler((t, e) - {if (t.getName().equals(http-nio-8100-Acceptor)) {log.error(tomcat Acceptor error, t);}});总结OOM异常对于tomcat服务来说是致命的发现即需要处理。对于内存泄漏来说留有时间给我们dump内存分析。但对于内存溢出来说由于其会回收可能在某个时间OOM顺便把tomcat打挂了然后就回收了此时我们去dump也未必有用所以-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath 参数是很有必要需要加上的。

相关新闻

怎么看待移动互联网时代

怎么看待移动互联网时代

土刺评沧项目上使用SpringCloudGateway作为网关承接公网上各个业务线进来的请求流量,在网关的前面有两台Nginx反向代理了网关,网关做了一系列的前置处理后转发请求到后面各个业务线的服务,简要的网络链路为: 网关域名(wmg.test.co…

2026/7/7 4:28:41 阅读更多 →
【超详细教程】使用Windows Live Writer 和Office Word  发布文章到全面总结

【超详细教程】使用Windows Live Writer 和Office Word 发布文章到全面总结

谋荣淘湍1. 前言 目前国产化系统浪潮下,适配鸿蒙是中国软件大势所趋,.NET作为最适合开发客户端语言之一,适配鸿蒙系统(HarmonyOS Next)是目前.NET开发者最关心的事情。我目前业余时间正在移植Avalonia到HarmonyOS,去年在.NET Conf…

2026/7/6 18:44:18 阅读更多 →
经验分享:CSS浮动(float,clear)通俗讲解

经验分享:CSS浮动(float,clear)通俗讲解

露梦膊墩1.理论习题 【中英】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第二周测验 这是本周理论部分的习题和相应解析,博主已经做好了翻译和解析工作,因此便不再重复,但有一题涉及到代码中矩阵的两种乘法,我们把这道题…

2026/5/17 9:26:06 阅读更多 →

最新新闻

Python API自动化测试框架:从设计原理到工程实践全解析

Python API自动化测试框架:从设计原理到工程实践全解析

1. 项目概述:为什么我们需要一个自己的API自动化框架?在软件开发和测试领域,API接口自动化测试早已不是新鲜事。市面上有Postman、JMeter、RestAssured等成熟工具,开源社区也有pytest-requests、httpx等优秀的库。那么&#xff0c…

2026/7/7 4:29:44 阅读更多 →
论软件测试方法及应用

论软件测试方法及应用

论软件测试方法及应用请围绕“论软件测试方法及应用”论题,依次从以下三个方面进行论述。1.概要叙述你参与管理和开发的软件项目以及你在其中所承担的主要工作。2.说明三种静态测试方法的概念,代码审查,静态结构分析和代码质量度量。3.结合项…

2026/7/7 4:27:44 阅读更多 →
别再死磕提示词了!2026年,做小红书图文带货,聪明人都在用这套“商品工作流

别再死磕提示词了!2026年,做小红书图文带货,聪明人都在用这套“商品工作流

最近跟几个做小红书图文带货的朋友聊天,大家普遍有一种很深的无力感。不是因为不够努力,相反,大家都很拼。天天在各种群里收藏最新的 AI 提示词,追着各种新工具跑,甚至连最近流行的“循环工程”都去研究了一遍。但回到…

2026/7/7 4:25:44 阅读更多 →
RT-Thread 内核对象管理机制剖析:从 rt_object 结构体看设计模式在 RTOS 中的落地

RT-Thread 内核对象管理机制剖析:从 rt_object 结构体看设计模式在 RTOS 中的落地

RT-Thread 内核对象管理机制剖析:从 rt_object 结构体看设计模式在 RTOS 中的落地 一、当内核对象的数据结构成为架构瓶颈 在 RTOS 的开发中,线程、信号量、互斥量、消息队列、定时器等内核对象是构建并发应用的基础。不同的 RTOS 对这些对象的管理方式差…

2026/7/7 4:21:43 阅读更多 →
数据中心存储系统故障了?怎么办!

数据中心存储系统故障了?怎么办!

存储系统是大数据与云计算的基础,其稳定性至关重要。以下是针对存储系统故障处置的简要思路总结。前置准备 处理故障前,需深入理解存储系统的架构与原理。典型存储系统由主机、交换机和存储设备组成,通过直连、IP网络或FC网络互联&#xff0c…

2026/7/7 4:19:42 阅读更多 →
ATT专利开放催生硅谷,AI时代公有智慧私有攫取引发法律与伦理争议!

ATT专利开放催生硅谷,AI时代公有智慧私有攫取引发法律与伦理争议!

公有智慧的私有攫取1956年1月24日,美国电话电报公司(AT&T)作为当时全球最大私营公司,营收占美国GDP近2%,有74.6万员工。旗下贝尔实验室成就卓越,为科学家赢得五项图灵奖和十项诺贝尔奖。当天AT&T签…

2026/7/7 4:17:42 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻