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

青岛网站建设推进福建龙岩有哪些网络平台

青岛网站建设推进,福建龙岩有哪些网络平台,如何建设网站后台,装修设计公司取名一#xff1a;背景 1. 讲故事去年十月份有位朋友从微信找到我#xff0c;说他的程序内存要炸掉了。。。截图如下#xff1a;时间有点久#xff0c;图片都被清理了#xff0c;不过有点讽刺的是#xff0c;自己的程序本身就是做监控的#xff0c;结果自己出了问题#xf… 一背景 1. 讲故事去年十月份有位朋友从微信找到我说他的程序内存要炸掉了。。。截图如下时间有点久图片都被清理了不过有点讽刺的是自己的程序本身就是做监控的结果自己出了问题太尴尬了二Windbg 分析 1. 托管还是非托管这个是甄别内存问题的第一步通过 !address -summary 和 !eeheap -gc 两个命令基本就可以断定。0:000 !address -summary                              Mapping file section regions... Mapping module regions... Mapping PEB regions... Mapping TEB and stack regions... Mapping heap regions... Mapping page heap regions... Mapping other regions... Mapping stack trace database regions... Mapping activation context regions...--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal Free                                    237     7ffc1e222000 ( 127.985 TB)           99.99% unknown                               594        3b9b20000 (  14.901 GB)  95.96%    0.01% Heap                                    370        012a2a000 ( 298.164 MB)   1.88%    0.00% Image                                  1248        00ee5a000 ( 238.352 MB)   1.50%    0.00% Stack                                   315        006780000 ( 103.500 MB)   0.65%    0.00% Other                                    13        0001d7000 (   1.840 MB)   0.01%    0.00% TEB                                     105        0000d2000 ( 840.000 kB)   0.01%    0.00% PEB                                       1        000001000 (   4.000 kB)   0.00%    0.00%--- Type Summary (for busy) ------ RgnCount ----------- Total Size -------- %ofBusy %ofTotal MEM_PRIVATE                            1178        3ce03d000 (  15.219 GB)  98.00%    0.01% MEM_IMAGE                              1409        00f6fd000 ( 246.988 MB)   1.55%    0.00% MEM_MAPPED                               59        004694000 (  70.578 MB)   0.44%    0.00%--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal MEM_FREE                                237     7ffc1e222000 ( 127.985 TB)           99.99% MEM_COMMIT                             2326        3c7543000 (  15.115 GB)  97.33%    0.01% MEM_RESERVE                             320        01a88b000 ( 424.543 MB)   2.67%    0.00%0:000 !eeheap -gc Number of GC Heaps: 1 generation 0 starts at 0x0000009902B57670 generation 1 starts at 0x0000009902A56810 generation 2 starts at 0x00000095318C1000 ephemeral segment allocation context: (0x0000009902D724A8, 0x0000009902D724C0)segment             begin         allocated         committed    allocated size    committed size ... 00000098FFBE0000  00000098FFBE1000  0000009902D724A8  0000009902D7D000  0x31914a8(51975336)  0x319c000(52019200) Large object heap starts at 0x00000095418C1000segment             begin         allocated         committed    allocated size    committed size 00000095418C0000  00000095418C1000  00000095475D8D98  00000095475D9000  0x5d17d98(97615256)  0x5d18000(97615872) Total Allocated Size:              Size: 0x398e6cbc8 (15450164168) bytes. Total Committed Size:              Size: 0x398e7b000 (15450222592) bytes. ------------------------------ GC Allocated Heap Size:    Size: 0x398e6cbc8 (15450164168) bytes. GC Committed Heap Size:    Size: 0x398e7b000 (15450222592) bytes.从输出信息看好家伙。。。进程提交内存是 15G, 托管堆差不多也是 15G这就说明当前是相对简单的 托管内存泄漏。2. 到底是什么在泄漏要想知道到底是什么在泄漏可以先到托管堆上看看有没有什么异常的对象使用 !dumpheap -stat 命令。0:000 !dumpheap -stat Statistics:MT    Count    TotalSize Class Name ... 00007ff8815d0f88  7260233    290409320 System.Collections.ArrayList 00007ff8815e6830  7313696    326240826 System.String 000000952fbbd2b0 12141398    509369998      Free 00007ff880685cf0  7254983    928637824 System.Diagnostics.ProcessInfo 00007ff88065f7d0  7256845   2031916600 System.Diagnostics.Process 00007ff8815e6ea8  7391338   2230744600 System.Object[] 00007ff88068fa70 186800748   8966435904 System.Diagnostics.ThreadInfo从卦象上来看真的太奇怪了如果大家了解 Process 类应该知道 ProcessInfo 和 ThreadInfo 都是挂在 Process 下的而且 ThreadInfo 对象高达 1.8亿真的太了看样子程序是在不断的做 Process.Start 操作吧。接下来要探究的问题是 ThreadInfo 到底正在被谁持有可以挑几个看看它们的 !gcroot 首尾法查了几个都是没有引用根如下所示0:000 !gcroot 0000009531e8f760 Found 0 unique roots (run !GCRoot -all to see all roots). 0:000 !gcroot 0000009531e8f670  Found 0 unique roots (run !GCRoot -all to see all roots). 0:000 !gcroot 0000009531e8f378 Found 0 unique roots (run !GCRoot -all to see all roots).3. 无引用根为什么不被回收既然对象没有引用根为什么 GC 不回收它呢这里就需要谈经验了在我之前分析的很多关于内存泄漏 的dump中我都是从 生产端 找问题貌似还没有出现一个从 消费端 找问题的案例参考模型如下生产者既然没问题那消费端能有什么问题呢大家可以想一想托管堆的消费端起码有两个角色。GCFinalizer 线程GC 肯定是不会出问题的,那就只能怀疑 Finalizer 线程出了什么问题可以用  !t 命令把所有线程调出来看看。0:000 !t ThreadCount:      9566 UnstartedThread:  0 BackgroundThread: 88 PendingThread:    0 DeadThread:       9471 Hosted Runtime:   noLock  ID OSID ThreadOBJ           State GC Mode     GC Alloc Context                  Domain           Count Apt Exception0    1 40e18 000000952fbdfe50    26020 Preemptive  0000000000000000:0000000000000000 000000952fbd2e40 0     STA 2    2 41ce8 000000952fc0e4d0    2b220 Preemptive  0000000000000000:0000000000000000 000000952fbd2e40 0     MTA (Finalizer) 4    4 41cb4 000000954c324970    27220 Preemptive  0000000000000000:0000000000000000 000000952fbd2e40 0     STA 5    5 41cb8 000000954c36d1e0  2027220 Preemptive  0000000000000000:0000000000000000 000000952fbd2e40 0     STA 6    6 41c58 000000954c33f070  2027220 Preemptive  0000000000000000:0000000000000000 000000952fbd2e40 0     STA 7    7 41c38 000000954c33f840    27220 Preemptive  0000000000000000:0000000000000000 000000952fbd2e40 0     STA 8    8 41e0c 000000954c333580    27220 Preemptive  0000000000000000:0000000000000000 000000952fbd2e40 0     STA 9    9 41e2c 000000954c354440    27220 Preemptive  0000000000000000:0000000000000000 000000952fbd2e40 0     STA 10   10 41f24 000000954c355840    27220 Preemptive  0000000000000000:0000000000000000 000000952fbd2e40 0     STA  ... XXXX 9446    0 000000957a233410  8039820 Preemptive  0000000000000000:0000000000000000 000000952fbd2e40 0     MTA (Threadpool Completion Port)  XXXX 9447    0 0000009579f83e30  8039820 Preemptive  0000000000000000:0000000000000000 000000952fbd2e40 0     MTA (Threadpool Completion Port)  XXXX 9450    0 000000957a46dcf0  8039820 Preemptive  0000000000000000:0000000000000000 000000952fbd2e40 0     MTA (Threadpool Completion Port)  XXXX 9449    0 000000957967c6e0  8039820 Preemptive  0000000000000000:0000000000000000 000000952fbd2e40 0     MTA (Threadpool Completion Port)  XXXX 9448    0 000000957aee0010  8039820 Preemptive  0000000000000000:0000000000000000 000000952fbd2e40 0     MTA (Threadpool Completion Port)  XXXX 9452    0 00000095796824a0  8039820 Preemptive  0000000000000000:0000000000000000 000000952fbd2e40 0     MTA (Threadpool Completion Port)  XXXX 9451    0 000000957af05df0  8039820 Preemptive  0000000000000000:0000000000000000 000000952fbd2e40 0     MTA (Threadpool Completion Port)这不看不知道一看吓一跳当前进程有 9566 个死线程高达 9471 个 以过往经验这小子不用线程池用 new Thread 咯, 吐槽结束再看下 Finalizer 线程正在做什么,使用 ~2s !dumpstack0:002 ~2s ntdll!NtWaitForSingleObject0xa: 00007ff88e220c8a c3              ret 0:002 !dumpstack OS Thread Id: 0x41ce8 (2) Current frame: ntdll!NtWaitForSingleObject0xa Child-SP         RetAddr          Caller, Callee 0000009549e4e120 00007ff88b591118 KERNELBASE!WaitForSingleObjectEx0x94, calling ntdll!NtWaitForSingleObject 0000009549e4e1c0 00007ff88da3e334 combase!MTAThreadWaitForCall0x54 [d:\9147\com\combase\dcomrem\channelb.cxx:5657], calling KERNELBASE!WaitForSingleObject 0000009549e4e210 00007ff88d8fe089 combase!MTAThreadDispatchCrossApartmentCall0x75 [d:\9147\com\combase\dcomrem\chancont.cxx:193], calling combase!MTAThreadWaitForCall [d:\9147\com\combase\dcomrem\channelb.cxx:5619] 0000009549e4e240 00007ff88da3e13d combase!CRpcChannelBuffer::SendReceive20x64b [d:\9147\com\combase\dcomrem\channelb.cxx:4796], calling combase!MTAThreadDispatchCrossApartmentCall [d:\9147\com\combase\dcomrem\chancont.cxx:156] 0000009549e4e2b0 00007ff88e1bb6f7 ntdll!RtlAllocateHeap0xd7, calling ntdll!RtlpLowFragHeapAllocFromContext ... 0000009549e4f5d0 00007ff8827d79cd clr!ManagedThreadBase_DispatchOuter0x75, calling clr!ManagedThreadBase_DispatchMiddle 0000009549e4f5e0 00007ff8828601af clr!EEConfig::GetConfigDWORD_DontUse_0x3b, calling clr!EEConfig::GetConfiguration_DontUse_ 0000009549e4f660 00007ff8828574fa clr!FinalizerThread::FinalizerThreadStart0x10a, calling clr!ManagedThreadBase_DispatchOuter 0000009549e4f6a0 00007ff8827d55b9 clr!EEHeapFreeInProcessHeap0x45, calling kernel32!HeapFreeStub 0000009549e4f700 00007ff882882e8f clr!Thread::intermediateThreadProc0x86 0000009549e4f780 00007ff882882e6f clr!Thread::intermediateThreadProc0x66, calling clr!_chkstk 0000009549e4f7c0 00007ff88dcd13d2 kernel32!BaseThreadInitThunk0x22 0000009549e4f7f0 00007ff88e2003c4 ntdll!RtlUserThreadStart0x34从堆栈信息看原来是终结器线程卡死了从 MTAThreadDispatchCrossApartmentCall 方法看貌似是 MTA 向 STA 做了一个调用到这里有经验的朋友应该知道这和 com 组件有关系了也就是说 Finalizer 线程无法释放由 STA 线程创建的 COM 对象那到底是哪一个线程创建了没有被合理释放的 COM 组件呢4. 寻找创建 COM 组件的线程说实话这个对COM组件不了解的话很难找出答案但天无绝人之路当我回头看 线程列表 的时候发现居然有 38 个 STA线程截图如下这里面肯定有问题接下来抽一个线程看看调用栈如何。0:004 !clrstack  OS Thread Id: 0x41cb4 (4)Child SP               IP Call Site 000000954da1ee38 00007ff88e220c8a [HelperMethodFrame: 000000954da1ee38] System.Threading.Thread.SleepInternal(Int32) 000000954da1ef30 00007ff88138c20a *** WARNING: Unable to verify checksum for mscorlib.ni.dll System.Threading.Thread.Sleep(Int32) 000000954da1ef60 00007ff82322437f xxx.CFileLogTask.DoWork() 000000954da1f160 00007ff8232234d6 xxx.CTask.InitStart() 000000954da1f240 00007ff8813c31d3 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 000000954da1f310 00007ff8813c3064 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 000000954da1f340 00007ff8813c3032 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 000000954da1f390 00007ff8813bc812 System.Threading.ThreadHelper.ThreadStart() 000000954da1f5e8 00007ff8827d6bb3 [GCFrame: 000000954da1f5e8]  000000954da1f938 00007ff8827d6bb3 [DebuggerU2MCatchHandlerFrame: 000000954da1f938]接下来反编译下 xxx.CFileLogTask.DoWork() 方法看看它是如何被 Thread 执行的。到这里终于水落石出罪魁祸首在 CurrThread.SetApartmentState(ApartmentState.STA); 这一句上我也不知道为啥开个 Thread 还要给个 STA。。。三总结 本次事故主要是因为在 STA 线程上用到了 COM 组件导致让 MTA 模型的 Finalizer 线程去释放时被卡死而这个Thread又没有用 Application.Run 启动消息循环STA也是 Sleep 状态我个人感觉两者无法通讯给到朋友的建议是去掉 Thread 的 STA。其实这里有一个很好的点就是当内存暴涨不一定是 生产端 的问题也有可能是 消费端 。
http://www.yutouwan.com/news/113775/

相关文章:

  • 网站制作架构建设部网站证件查询
  • 徐州住房与城乡建设部网站wordpress显示作者的信息
  • 国外的有趣设计网站免费网页制作网站
  • 专业网站是指什么wordpress主题付费吗
  • 奈曼旗华水建设工程公司网站南宁360网
  • 网站建设模板研究广州网站建设电话咨询
  • 网站正在建设中 免费设计官网首页
  • 营销网站建设方案中国seo第一人
  • 网站建设初期的宣传深圳制作网站主页
  • 网站开发教学网站百度分享 wordpress
  • 吉林网站制作选择乐云seo江苏营销型网站策划
  • 网站主机 流量广州市城乡和建设局网站
  • 网站权重与排名浅谈建设公司网站账务处理
  • jsp网站开发实例.百度网盘创业网站建设规划书
  • 模板建站设计网站页面教案
  • 如何建立一个网站卖货网站建设图片排版
  • 宁波市海曙区建设局网站国家高新区网站建设
  • 中国工商做年报网站网站建设个人建设
  • 大庆建设中专网站网站开发服务器
  • 公司网站维护怎么做小程序有做门户网站
  • 电子 网站模板seo优化是怎么优化的
  • wordpress临时关闭站点电商网站流量统计
  • 学做网站后台开发网站建设步骤与时间表
  • 网站建立快捷方式如何用wordpress搭建网站
  • 深圳专业做网站技术制作网站源码
  • 河南省住房和城乡建设厅投诉网站solaris.wordpress
  • 做电商网站要多少钱竞价sem培训
  • 科技大学全国排名搜狗seo查询
  • 在线生成手机网站phpnow wordpress
  • 世纪兴网站建设找工程分包网站