文章插图
从图中可以看到 , 有两个 xxxx/Export
请求运行时间非常高,一个是 4min30s
,一个是 50s
, 刚好落在了 42
和 46
号线程上 。
- 借助第二个 dump 文件
!whttp
验证 。文章插图
接下来我们就要调研为什么这两个线程会运行这么久?
3. 为什么会运行这么久既然是 Export 导出文件,第一时间就应该想到是不是和数据量有关?通过线程栈上的方法 , 发现是一个
List
集合,接下来用 !dso
命令找出来看看 。0:042> !dsoOS Thread Id: 0x146c (42)RSP/REGObjectName00000089ABCFCAC8 0000020683b7c128 System.Drawing.Bitmap00000089ABCFCAF8 0000020683b7c158 System.Drawing.Graphics00000089ABCFCB10 0000020683b7c128 System.Drawing.Bitmap00000089ABCFCB30 0000020683b7c128 System.Drawing.Bitmap00000089ABCFCB40 0000020683b7c4d0 NPOI.XSSF.UserModel.XSSFCellStyle00000089ABCFCB50 0000020683b7c198 NPOI.XSSF.UserModel.XSSFRichTextString00000089ABCFCB68 0000020683b7c198 NPOI.XSSF.UserModel.XSSFRichTextString00000089ABCFCBC0 0000020683b7c198 NPOI.XSSF.UserModel.XSSFRichTextString00000089ABCFCBC8 0000020683b7c2e8 System.String[]00000089ABCFCBD0 0000020683b7c360 System.Drawing.Font00000089ABCFCDE8 0000020666501240 System.Collections.Generic.List`1[[System.Collections.Generic.List`1[[System.Object, mscorlib]], mscorlib]]...0:042> !do 0000020666501240Name:System.Collections.Generic.List`1[[System.Collections.Generic.List`1[[System.Object, mscorlib]], mscorlib]]MethodTable: 00007ffbde342440EEClass:00007ffc36fc2af8Size:40(0x28) bytesFile:C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dllFields:MTFieldOffsetType VTAttrValue Name00007ffc36e4e25040018a08System.__Canon[]0 instance 00000207658592d8 _items00007ffc36e385a040018a118System.Int321 instance44906 _size00007ffc36e385a040018a21cSystem.Int321 instance44906 _version00007ffc36e35dd840018a310System.Object0 instance 0000000000000000 _syncRoot00007ffc36e4e25040018a40System.__Canon[]0sharedstatic _emptyArray>> Domain:Value dynamic statics NYI 0000020563eec3c0:NotInit dynamic statics NYI 0000020795f5b9a0:NotInit<<
可以清楚的看到 , 这个list高达 4.5w
,这个量级说多也不多,说少也不少 , 言外之意就是代码写的也不好不到哪里去 。4. 用户代码要承担责任吗要判断用户代码是不是很烂,除了白盒看代码,也可以黑盒观察这几个线程栈,可以发现两个dump 显示的栈信息都和
AutoSizeColumn
方法有关 。00000089abcfcae0 00007ffbdd52ac3f System.Drawing.Image.Dispose(Boolean)00000089abcfcb30 00007ffbdd556b5a System.Drawing.Image.Dispose()00000089abcfcb60 00007ffbe39397c7 NPOI.SS.Util.SheetUtil.GetCellWidth(NPOI.SS.UserModel.ICell, Int32, NPOI.SS.UserModel.DataFormatter, Boolean)00000089abcfcc00 00007ffbe3939654 NPOI.SS.Util.SheetUtil.GetCellWidth(NPOI.SS.UserModel.ICell, Int32, NPOI.SS.UserModel.DataFormatter, Boolean)00000089abcfcd30 00007ffbe39382e1 NPOI.SS.Util.SheetUtil.GetColumnWidth(NPOI.SS.UserModel.ISheet, Int32, Boolean)00000089abcfcdc0 00007ffbe39380bc NPOI.XSSF.UserModel.XSSFSheet.AutoSizeColumn(Int32, Boolean)
从名字看是 NOPI 提供的自动调整列宽
的方法,那是不是这个方法的单次性能很慢呢?要寻找答案,只能求助百度啦 。。。- 图一
文章插图
- 图二
文章插图
- 数据量大
- AutoSizeColumn 速度慢
- 代码上的其他因素
AutoSizeColumn
方法忘了改掉 。三:总结这个 Dump 分析起来其实非常简单,思路也比较明朗,重点还是提醒一下大家慎用 NPOI 的
AutoSizeColumn
方法,弄不好就得出个生产事故!文章插图
推荐阅读
- 支付宝的花呗怎么还款(支付宝怎么查花呗还款记录)
- 怎么删除微信上已经添加的朋友(微信怎么查删除掉的好友添加记录)
- flood_it 方法记录
- 【博学谷学习记录】超强总结,用心分享|MySql连接查询超详细总结
- RX6600XT评测_RX6600XT游戏表现
- Java核心技术阅读笔记 java中的自动拆装箱与缓存
- 记一次 .NET 某工控视觉软件 非托管泄漏分析
- 微信怎么删除好友,微信好友怎么快速删除(微信怎么一次性删除所有的好友)
- control 掌控 方法记录
- n维偏序 方法记录