.Net 内存对象分析

 

在生产环境中,通过运行日志我们会发现一些异常问题,此时,我们不能直接拿VS远程到服务器上调试,同时日志输出的信息无法百分百反映内存中对象的状态,比如说我们想查看进程中所有的Socket连接状态、服务路由信息等等。

即:如何分析.Net 运行时内存对象?

所以,今天我们推荐.Net进阶必备神器:Windbg,基于Windbg分析内存中对象的状态。

还是以实际场景为例吧,这样可以更加贴合实际应用,同时更有借鉴意义。

业务场景:分布式环境下,各个服务容器进程中缓存了各个服务的Socket连接信息,方便运行时服务间相互访问。但是网络是偶尔要抖动的,在抖动的一瞬间,很多Socket连接便中断了,服务调用方收到的异常信息便是:连接已中断等。

如何快速定位到哪些Socket连接是中断的?这些中断的Socket连接是连接的哪些服务器、端口?这些信息可以帮助我们分析具体的网络问题,同时做一些程序上的补偿:连接重建。一个目标,保持程序的高可用性!

那么,请出我们今天的主角:Windbg,微软的官方介绍:

http://windbg.org/

进一步说,我们需要抓取指定进程某一瞬间的内存镜像,然后使用Windbg分析内存中各种对象、线程、线程池、析构队列、堆、CPU内核时间片等的状态。

因此,第一步,我们需要对要进行内存分析的进程,抓取一个Full Dump文件:内存镜像文件。

任务管理器->选择进程->创建转储文件

系统会将Dump文件存储在指定的目录,这个目录需要拷贝一下,以备用。

第二步,从下面路径下载并安装Windbg

https://developer.microsoft.com/en-us/windows/hardware/download-windbg

请根据操作系统的位数,选择X86或者X64。这里我们用的64位操作系统,选择的Windbg(X64)

第三步:Ctrl+D,打开刚才抓取的Dump文件

第四步:加载调试用的SOS.dll: .loadby sos clr

.loadby sos clr

第五步:查看内存中指定类型的对象

!dumpheap -Type Socket

这里的Socket是具体的类型,我们要查看Socket连接状态,所以类型是Socket

这里的Header中MT=Method Table

我们需要用的MT:00007ffafe50d700

第六步,查看内存所有所有的Socket对象的地址:

!dumpheap -mt 00007ffafe50d700

输出结果中,第一列是某一个Socket对象的内存地址

此时,我们可以使用下面的命令,随机查看一个Socket对象的信息:

!do 000001b2d188ae00

!do 的意思:!dumpObj

那么问题来了,几百个Socket对象,如果一个一个!do查看,这工作量太大了! 当然不能这么干,Windbg有.foreach命令

搜索Debugging help.chm文档,.foreach给了个样例:

.foreach /f ( place "g:\myfile.txt") { dds place } 

即,循环遍历一个文本文件,对每一行数据,执行一个命令操作。

好,我们回到我们上一步的输出中:每个Socket对象的地址列表,我们拷贝出来,用文本编辑工具只取出第一列(Socket地址列),保存成1.txt

第七步:循环遍历查看每个内存对象

.foreach /f (adr "C:\1.txt") {!do adr}

输出:

将所有的输出,拷贝到文本编辑器中,搜索查询指定的属性,例如m_IsConnected=0, 即可找出连接断开的Socket对象,然后进一步用!gcroot 查看这个对象的引用关系,再一步一步看各个引用对象的信息就可以大致分析了。

以上就是.Net 内存对象分析的整个过程,分享给大家。

分析Net 内存对象的更多相关文章

  1. .Net 内存对象分析

    在生产环境中,通过运行日志我们会发现一些异常问题,此时,我们不能直接拿VS远程到服务器上调试,同时日志输出的信息无法百分百反映内存中对象的状态,比如说我们想查看进程中所有的Socket连接状态.服务路 ...

  2. JVM 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析

    转自:https://blog.csdn.net/tjiyu/article/details/53982412 1-1.为什么需要了解垃圾回收 目前内存的动态分配与内存回收技术已经相当成熟,但为什么还 ...

  3. MemCache分布式内存对象缓存系统

    MemCache超详细解读 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而 ...

  4. Memcached源码分析之内存管理

    先再说明一下,我本次分析的memcached版本是1.4.20,有些旧的版本关于内存管理的机制和数据结构与1.4.20有一定的差异(本文中会提到). 一)模型分析在开始解剖memcached关于内存管 ...

  5. iOS的内存分析和内存管理

    iOS的内存分析和内存管理 [内存管理]一直是iOS开发中的一个重点. 本文就带你从内存分析开始一步步了解内存的占用情况,从真实的情况中领悟真正项目开发过程中的内存的使用情况. 注:本文默认你熟悉 M ...

  6. 分析 ThreadLocal 内存泄漏问题

    ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度.但是如果滥用 ThreadLocal,就可能会导 ...

  7. 使用MAT分析Java内存

    Overview MAT(Memory Analyzer Tool) 是一个JAVA Heaper分析器,可以用来分析内存泄露和减少内存消耗.分析Process showmap中的/dev/ashme ...

  8. 大数据学习--day13(字符串String--源码分析--JVM内存分析)

    字符串String--源码分析--JVM内存分析 String 类的对象 , 是不可变的字符串对象呢 这个不可变很重要,之后要讲的intern()也离不开它的不可变性. https://www.cnb ...

  9. [转]一次使用Eclipse Memory Analyzer分析Tomcat内存溢出

    一次使用Eclipse Memory Analyzer分析Tomcat内存溢出 前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序 ...

随机推荐

  1. 如何让hudson的两个job共用一个svn工作目录

    作者:朱金灿 来源:http://blog.csdn.net/clever101 现在我的需求是这样的:一个软件需要编译完全版本和基础版本,完全版本的基础功能较多,基础版本只包含了基础功能.有时只需要 ...

  2. Kinect 开发 —— 骨骼追踪 (下)

    基于景深数据的用户交互 骨骼数据中关节点不仅有X,Y值,还有一个深度值 除了使用WPF的3D特性外,在布局系统中可以根据深度值来设定可视化元素的尺寸大小来达到某种程序的立体效果. 下面的例子使用Can ...

  3. Activemq去除认证

    0.背景介绍 由于项目安全性的约束,不能在配置文件中暴露一些密码信息.   默认情况下,ActiveMQ在进行接发消息的时候会用户认证.通过ActiveMQ-client初始化ActiveMQConn ...

  4. 查看oracle数据库的启动时间

    Oracle的sys用户下有个视图v_$instance,该视图只有一行数据.通过SQL语名可查询其内容: select * from sys.v_$instance 此视图可查看很多东西,如实例名, ...

  5. badblocks 检查硬盘是否有坏道

    硬盘是比較easy坏掉的设备,使用一段时间后可能会出现坏道等物理故障. 当硬盘出现坏道后,若不及时更换或者进行技术上的处理,磁盘的坏道就会越来越多,并会造成频繁死机和数据丢失. 最好的处理方法是更换新 ...

  6. 经验之谈—让你看明确block

    事实上我感觉不常常使用block的朋友.对block应该是比較陌生的,那么如今我们来扒开block的真面目,看看block的本质 普通的局部变量.block内部仅仅会引用它初始的值(block定义那一 ...

  7. eclipse- DDMS截图功能使用

    如何使用eclipse的截图功能呢 1.打开eclipse 2.连接手机 3.打开eclipse的DDMS插件. 4.选中手机 5.点击上面的摄像机图标,就可以截图了 如果你打开了DDMS以后,没有发 ...

  8. android图片特效处理之锐化效果

    这篇将讲到图片特效处理的锐化效果.跟前面一样是对像素点进行处理,算法是通用的. 算法原理: 一.简单算法:分别获取当前像素点和八个周围像素点的RGB值,先求出当前像素点的RGB值与八个像素点RGB值的 ...

  9. JavaScript中的global对象,window对象以及document对象的区别和联系

    JavaScript中的global对象,window对象以及document对象的区别和联系 一.概念区分:JavaScript中的global对象,window对象以及document对象 1.g ...

  10. 13.AxisUtil

    1. package com.glodon.gspm.adapter.plugin.common; import lombok.SneakyThrows; import org.apache.axis ...