一:背景 这篇我们来聊一下 PerfView 在协助 WinDbg 分析 Dump 过程中的两个超实用技巧,可能会帮助我们快速定位最后的问题,主要有如下两块: 洞察内存泄漏中的静态大集合变量名. 验证当前程序的 GC 模式. 这里就把经验分享一下,希望让大家少走弯路. 二:如何洞察 1. 查看静态变量名 如果有过 dump 分析经验的朋友应该知道,当你历经千辛万苦在 内存泄漏 的dump文件中找到了那个内存泄漏最大的集合,但遗憾的是,你不知道这个 集合 的变量名叫什么? 为了方便讲述,先上一段测…
本期是移动开发精英俱乐部的第13期文章,都是以技术为主,所以这里就不过多的进行赘述了,我们直接看干货内容吧!本文系ITOM管理平台OneAPM整理. 实际项目中的MVVM(积木)模式–序章 导读:开篇之前,先贴上以该设计模式为基础的iOSAPP的App Store地址:https://appsto.re/cn/neiscb.i 这个项目通过笔者所要讲的设计模式,三个人在同时需要忙于其他项目维护的情况下,从开工到上架,前前后后加起来用了一个月的时间.因此,在保证项目质量的前提下,敏捷开发以及如何保…
一:背景 C# 程序内存泄漏的诱发因素有很多,但从顶层原理上来说,就是该销毁的 用户根 对象没有被销毁,从而导致内存中意料之外的对象无限堆积,导致内存暴涨,最终崩溃,这其中的一个用户根就是 终结器队列,这一篇我们就来看下如何让 PerfView 配合 WinDbg 双剑合璧. 二:如何洞察 1. 终结器内存泄漏 为了模拟 终结器内存泄漏,我们故意在 析构函数 中执行复杂的逻辑,让析构过程足够的慢,这样可以实现 分配速度 远大于 销毁速度 ,达到消费能力不足引发的内存暴涨, 参考如下代码: int…
一:背景 去年 GC架构师 Maoni 在 (2021 .NET 开发者大会) [https://ke.segmentfault.com/course/1650000041122988/section/1500000041123017] 上演示过 PerfView 的 Diff 功能来寻找内存增量,个人感觉这个功能非常不错,简单省事,所以这里就整合到 PerfView 专题中,分享一下给大家. 二:洞察内存增量 1. 什么是内存增量 其实非常好理解,就是当你的程序出现了内存泄漏,你可以在程序内存…
一:背景 上一篇我们聊到了如何用 PerfView 去侦察 NTHeap 的内存泄漏,这种内存泄漏往往是用 C 的 malloc 或者 C++ 的 new 分配而不释放所造成的,这一篇我们来聊一下由 VirtualAlloc 方法造成的泄漏如何去甄别? 了解 VirtualAlloc 的朋友肯定说, C# 这种高层语言怎么可能会用 VirtualAlloc 呢?即便是 C++ 大概率也不会用这个,其实这么说还是世面见少了,经历的案例太少,接下来我们就来简要聊一聊. 二: C# 中真的会用 Vir…
一:背景 前几篇我们聊的都是 非托管内存泄漏,这一篇我们再看下如何用 PerfView 来排查 托管内存泄漏 ,其实 托管内存泄漏 比较好排查,尤其是用 WinDbg,毕竟C#是带有丰富的元数据,不像C++下去就是二进制. 二:如何分析 PerfView 用的是权重占比来寻找可疑的问题函数,为了方便讲述,我们先上一段问题代码. internal class Program { static void Main(string[] args) { Task.Run(Alloc1); Task.Run…
一:背景 上一篇我们聊到了如何用 PerfView 洞察 GC 的变化,但总感觉还缺了点什么? 对,就是要跟踪到底是什么代码触发了 GC,这对我们分析由于 GC 导致的 CPU 爆高有非常大的参考价值,在以前我都是用 WinDBG 来实现,但这玩意需要做一些侵入性操作,实战起来不是那么丝滑,虽然有可以录制功能的 TTD,所以需寻找完美的解决方案,在此可以借助一下 PerfView . 二:如何洞察 1. 一个小案例 为了方便讲解,先上一段简单的测试代码,不断的往 List 中塞入数据,可以实现不…
一:背景 前两篇我们都聊到了非托管内存泄漏,一个是 HeapAlloc ,一个是 VirtualAlloc,除了这两种泄漏之外还存在其他渠道的内存泄漏,比如程序集泄漏,这一篇我们就来聊一聊. 二: 程序集也会泄漏? 在我分析的一百多dump中,程序集方面的泄漏主要有 XmlSerializer 和 Castle.Proxy 这两个入口,这里就来探讨 XmlSerializer 所造成的泄漏. 1. 问题代码 为了方便讲述,先上一段测试代码,百分百内存泄漏,如假包换. internal class…
概括:   ·用Android studio写一个demo     ·配置leakcanary     ·加入内存泄漏代码片段     ·安装apk 验证结果     ·源码地址 一.android studio创建项目demo 1.不多写这一步了,正常按指示填写即可,不需要什么配置类的东西 2.创建打开后,先布局一个登录页面 打开路径:app-main-res-layout 或者到java下的mainActivity文件activity_main ,ctr+右击进去也可以定位到这个页面 Des…
C++的内存有五大分区:堆区.栈区.自由存储区.全局/静态存储区.常量存储区. 五个数据段:数据段.代码段.BSS段.堆.栈 内存分配方式有三种: 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. 在栈上创建. 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. 这个大小在linux上可以使用:ulimit…