精华内容
下载资源
问答
  • 使用RAMMAP的工具检查,发现这些内存被Metafile占用了,经查阅Metafile是系统缓存的一部分同时也包含了NTFS的数据。。此问题可能是由于Server 2008中为保证服务器性能不限制系统缓存,服务器系统长时间执行I/O,系统...
  • 一款可用于服务器内存检测工具软件,刻录光盘引导自动进行检测
  • 服务器压力检测工具

    2018-06-24 02:08:00
    用于服务器压力检测,对IO、CPU、内存等部件进行压力测试
  • DELL服务器硬件检测工具,该工具仅仅是提供了硬件检测报表功能,可以根据日志查看服务器的当前状态
  • 内存检测工具,可以实时了解内存状态,检测出有质量问题的内存.
  • 内存检测工具比较

    千次阅读 2010-11-21 20:26:00
    内存检测工具比较

    1.     ccmalloc-Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库。

    2.     Dmalloc-Debug Malloc Library.

    3.     Electric Fence-Linux分发版中由Bruce Perens编写的malloc()调试库。

    4.     Leaky-Linux下检测内存泄漏的程序。

    5.     LeakTracer-Linux、Solaris和HP-UX下跟踪和分析C++程序中的内存泄漏。

    6.     MEMWATCH-由Johan Lindh编写,是一个开放源代码C语言内存错误检测工具,主要是通过gcc的precessor来进行。

    7.     Valgrind-Debugging and profiling Linux programs, aiming at programs written in C and C++.

    8.     KCachegrind-A visualization tool for the profiling data generated by Cachegrind and Calltree.

    9.     Leak Monitor-一个Firefox扩展,能找出跟Firefox相关的泄漏类型。

    10. IE Leak Detector (Drip/IE Sieve)-Drip和IE Sieve leak detectors帮助网页开发员提升动态网页性能通过报告可避免的因为IE局限的内存泄漏。

    11. Windows Leaks Detector-探测任何Win32应用程序中的任何资源泄漏(内存,句柄等),基于Win API调用钩子。

    12. SAP Memory Analyzer-是一款开源的JAVA内存分析软件,可用于辅助查找JAVA程序的内存泄漏,能容易找到大块内存并验证谁在一直占用它,它是基于Eclipse RCP(Rich Client Platform),可以下载RCP的独立版本或者Eclipse的插件。

    13. DTrace-即动态跟踪Dynamic Tracing,是一款开源软件,能在Unix类似平台运行,用户能够动态检测操作系统内核和用户进程,以更精确地掌握系统的资源使用状况,提高系统性能,减少支持成本,并进行有效的调节。

    14. IBM Rational PurifyPlus-帮助开发人员查明C/C++、托管.NET、Java和VB6代码中的性能和可靠性错误。PurifyPlus 将内存错误和泄漏检测、应用程序性能描述、代码覆盖分析等功能组合在一个单一、完整的工具包中。

    15. Parasoft Insure++-针对C/C++应用的运行时错误自动检测工具,它能够自动监测C/C++程序,发现其中存在着的内存破坏、内存泄漏、指针错误和I/O等错误。并通过使用一系列独特的技术(SCI技术和变异测试等),彻底的检查和测试我们的代码,精确定位错误的准确位置并给出详细的诊断信息。能作为Microsoft Visual C++的一个插件运行。

    16. Compuware DevPartner for Visual C++ BoundsChecker Suite-为C++开发者设计的运行错误检测和调试工具软件。作为Microsoft Visual Studio和C++ 6.0的一个插件运行。

    17. Electric Software GlowCode-包括内存泄漏检查,code profiler,函数调用跟踪等功能。给C++和.Net开发者提供完整的错误诊断,和运行时性能分析工具包。

    18. Compuware DevPartner Java Edition-包含Java内存检测,代码覆盖率测试,代码性能测试,线程死锁,分布式应用等几大功能模块。

    19. Quest JProbe-分析Java的内存泄漏。

    20. ej-technologies JProfiler-一个全功能的Java剖析工具,专用于分析J2SE和J2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合用途。JProfiler直觉式的GUI让你可以找到效能瓶颈、抓出内存泄漏、并解决执行绪的问题。4.3.2注册码:A-G666#76114F-1olm9mv1i5uuly#0126

    21. BEA JRockit-用来诊断Java内存泄漏并指出根本原因,专门针对Intel平台并得到优化,能在Intel硬件上获得最高的性能。

    22. SciTech Software AB .NET Memory Profiler找到内存泄漏并优化内存使用针对C#,VB.Net,或其它.Net程序。

    23. YourKit .NET & Java Profiler-业界领先的Java和.NET程序性能分析工具。

    24. AutomatedQA AQTime-AutomatedQA的获奖产品performance profiling和memory debugging工具集的下一代替换产品,支持Microsoft, Borland, Intel, Compaq 和 GNU编译器。可以为.NET和Windows程序生成全面细致的报告,从而帮助您轻松隔离并排除代码中含有的性能问题和内存/资源泄露问题。支持.Net 1.0,1.1,2.0,3.0和Windows 32/64位应用程序。

    25. JavaScript Memory Leak Detector-微软全球产品开发欧洲团队(Global Product Development- Europe team, GPDE) 发布的一款调试工具,用来探测JavaScript代码中的内存泄漏,运行为IE系列的一个插件。

     

     

    附录:内存泄漏的发生方式

    1.     常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。

    2.     偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。

    3.     一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块且仅有一块内存发生泄漏。

    4.     隐 式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是 对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

     

    什么是系统资源?

    当应用程序在Windows中运行时,Windows必须实时"跟踪"该应用程序的运行,并保留与之相关的许多信息,如按钮、光标、菜单的位置和位图、窗口的状况等,这些信息由Windows保留在一种叫堆的内存块中,堆的英文为Heap。简单地说,堆是采用特殊机制管理的内存块。由Windows的一个系统内核User.exe管理的堆叫做User资源堆(User Resource Heap),由另一个系统内核Gdi.exe管理的堆叫做GDI资源堆(Graphical Device Interface Resource Heap,简称GDI Resource Heap),User资源堆和GDI资源堆合称为系统资源堆(System Resource Heap),习惯上就把它们叫做系统资源(System Resource)。

      微软将Windows的系统资源(堆)分为五个堆,其中User资源堆为三个,而GDI资源堆为两个。

      三个User资源堆分别是:16位的用户堆(User Heap64KB);32位的窗口堆(Windows Heap2MB);32位的用户菜单堆(User Menu Heap2MB)。

      两个GDI资源堆分别是:16位的GDI堆(GDI Heap64KB);32位的GDI堆(GDI2MB)。

      从这里的系统资源分类和大小我们应该明白,不管CPUP4还是486,内存是8M还是1G,所有Windows的用户都拥有同样大小的系统资源(堆),用户不能自已增加或减少系统资源的大小,这是由操作系统决定的,与硬件档次没有任何关系。

       Windows User 资源堆和 GDI 资源堆的可用( Free )空间称为可用 User 资源和可用 GDI 资源, Windows 中以百分数表示它们,用户可以选择 " 开始 / 附件 / 系统工具 / 系统信息 " ,来实时查看它们的大小。

     

    展开全文
  • 内存CPU检测工具

    2017-08-07 10:40:01
    支持windows 64 和 32位
  • MemTest 是少见的内存检测工具,它不但可以彻底的检测出内存的稳定度,还可同时测试记忆的储存与检索资料的能力,让你可以确实掌控到目前你机器上正在使用的内存到底可不可信赖。 修正了几处翻译问题
  • 专业的检测内存工具,win10可用,可以检测内存条信息,cpu信息,同时可以检测显卡,以及cpu跑分,方便便捷点击即可
  • 基于开源的一个工具进行优化修改后的。本工具是PHP文件需要服务器支持PHP类型。可以帮助您检测服务器的网速、数据库是否能够正常连接、所在的服务器的硬盘大小、CPU、内存等情况。
  • 使用与 sdr ddr ddr1 ddr2,以及带有冗余校验功能的内存。很好用,占用空间小。的师傅是大方 飞东方士大夫vc
  • 最棒的内存检测工具memtest (Deluxe CD版),无任何限制,可检测2G以上大内存!
  • 内存泄露检测工具——LeakCanary

    千次阅读 2015-09-13 15:11:50
    很简单:我们不是创建服务不是为了赚钱;我们赚钱是为了提供更好的服务。...之前我们也介绍过Java中常用的内存泄露检测工具MAT,目前Java程序最常用的内存分析工具应该是MAT(Memory Analyzer Tool)

    很简单:我们不是创建服务不是为了赚钱;我们赚钱是为了提供更好的服务。我们认为这才是做事的态度。

    学习使用Java的同学都应该知道,Java的JVM给我们提供的垃圾回收机制是极为好用的。但是我们也很清楚,垃圾回收机制不是万能的,使用不当很容易造成内存泄露。之前我们也介绍过Java中常用的内存泄露检测工具MAT,目前Java程序最常用的内存分析工具应该是MAT(Memory Analyzer Tool),它是一个Eclipse插件,同时也有单独的RCP客户端。

    不熟悉MAT的同学,或者对Java垃圾回收机制不了解的同学,可以
    看我的这篇文章:http://blog.csdn.net/yzzst/article/details/26621861

    今天,这里我们不说MAT,我们说一个更有用的开源工具——LeakCanary。

    LeakCanary本质上就是一个基于MAT进行Android应用程序内存泄漏自动化检测的的开源工具,通过集成这个工具代码到自己的Android工程当中就能够在程序调试开发过程中通过一个漂亮的界面。

    随时发现和定位内存泄漏问题,而不用每次在开发流程中都抽出专人来进行内存泄漏问题检测,极大地方便了Android应用程序的开发。

    总的来说,LeakCanary有如下几个明显优点:

    1. 针对Android Activity组件完全自动化的内存泄漏检查。
    2. 可定制一些行为(dump文件和leaktrace对象的数量、自定义例外、分析结果的自定义处理等)。
    3. 集成到自己工程并使用的成本很低。(*主要)
    4. 友好的界面展示和通知。

    Github地址:https://github.com/square/leakcanary

    具体怎么使用?应用一下官方的翻译文档入下:


    LeakCanary

    这里写图片描述
    Android 和 Java 内存泄露检测。

    “A small leak will sink a great ship.” - Benjamin Franklin

    千里之堤, 毁于蚁穴。 – 《韩非子·喻老》


    开始使用

    在 build.gradle 中加入引用,不同的编译使用不同的引用:

     dependencies {
       debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
       releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
     }

    在 Application 中:

    public class ExampleApplication extends Application {
    
      @Override public void onCreate() {
        super.onCreate();
        LeakCanary.install(this);
    }

    这样,就万事俱备了! 在 debug build 中,如果检测到某个 activity 有内存泄露,LeakCanary 就是自动地显示一个通知。


    如何使用

    使用 RefWatcher 监控那些本该被回收的对象。

    RefWatcher refWatcher = {...};
    
    // 监控
    refWatcher.watch(schrodingerCat);

    LeakCanary.install() 会返回一个预定义的 RefWatcher,同时也会启用一个 ActivityRefWatcher,用于自动监控调用 Activity.onDestroy() 之后泄露的 activity。

    public class ExampleApplication extends Application {
    
      public static RefWatcher getRefWatcher(Context context) {
        ExampleApplication application = (ExampleApplication) context.getApplicationContext();
        return application.refWatcher;
      }
    
    
      private RefWatcher refWatcher;
    
      @Override public void onCreate() {
        super.onCreate();
        refWatcher = LeakCanary.install(this);
      }
    }
    

    使用 RefWatcher 监控 Fragment:

    public abstract class BaseFragment extends Fragment {
    
      @Override 
      public void onDestroy() {
        super.onDestroy();
        RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity());
        refWatcher.watch(this);
      }
    }

    工作机制

    1. RefWatcher.watch() 创建一个 KeyedWeakReference 到要被监控的对象。
    2. 然后在后台线程检查引用是否被清除,如果没有,调用GC。
    3. 如果引用还是未被清除,把 heap 内存 dump 到 APP 对应的文件系统中的一个 .hprof 文件中。
    4. 在另外一个进程中的 HeapAnalyzerService 有一个 HeapAnalyzer 使用HAHA 解析这个文件。
    5. 得益于唯一的 reference key, HeapAnalyzer 找到 KeyedWeakReference,定位内存泄露。
    6. HeapAnalyzer 计算 到 GC roots 的最短强引用路径,并确定是否是泄露。如果是的话,建立导致泄露的引用链。
    7. 引用链传递到 APP 进程中的 DisplayLeakService, 并以通知的形式展示出来。

    如何复制 leak trace?

    在 Logcat 中,你可以看到类似这样的 leak trace:

    
    In com.example.leakcanary:1.0:1 com.example.leakcanary.MainActivity has leaked:
    
    * GC ROOT thread java.lang.Thread.<Java Local> (named 'AsyncTask #1')
    * references com.example.leakcanary.MainActivity$3.this$0 (anonymous class extends android.os.AsyncTask)
    * leaks com.example.leakcanary.MainActivity instance
    
    * Reference Key: e71f3bf5-d786-4145-8539-584afaecad1d
    * Device: Genymotion generic Google Nexus 6 - 5.1.0 - API 22 - 1440x2560 vbox86p
    * Android Version: 5.1 API: 22
    * Durations: watch=5086ms, gc=110ms, heap dump=435ms, analysis=2086ms

    你甚至可以通过分享按钮把这些东西分享出去。


    SDK 导致的内存泄露

    随着时间的推移,很多SDK 和厂商 ROM 中的内存泄露问题已经被尽快修复了。但是,当这样的问题发生时,一般的开发者能做的事情很有限。

    LeakCanary 有一个已知问题的忽略列表,AndroidExcludedRefs.java,如果你发现了一个新的问题,请提一个 issue 并附上 leak trace, reference key, 机器型号和 SDK 版本。如果可以附带上 dump 文件的 链接那就再好不过了。

    对于最新发布的 Android,这点尤其重要。你有机会在帮助在早期发现新的内存泄露,这对整个 Android 社区都有极大的益处。

    开发版本的 Snapshots 包在这里: https://oss.sonatype.org/content/repositories/snapshots/


    leak trace 之外

    有时,leak trace 不够,你需要通过 MAT 或者 YourKit 深挖 dump 文件。

    通过以下方法,你能找到问题所在:

    1. 查找所有的 com.squareup.leakcanary.KeyedWeakReference 实例。
    2. 检查 key 字段
    3. Find the KeyedWeakReference that has a key field equal to the reference key reported by LeakCanary.
    4. 找到 key 和 和 logcat 输出的 key 值一样的 KeyedWeakReference。
    5. Referent 字段对应的就是泄露的对象。
    6. 剩下的,就是动手修复了。最好是检查到 GC root 的最短强引用路径开始。

    自定义

    UI 样式

    DisplayLeakActivity 有一个默认的图标和标签,你只要在你自己的 APP 资源中,替换以下资源就可。

    res/
      drawable-hdpi/
        __leak_canary_icon.png
      drawable-mdpi/
        __leak_canary_icon.png
      drawable-xhdpi/
        __leak_canary_icon.png
      drawable-xxhdpi/
        __leak_canary_icon.png
      drawable-xxxhdpi/
        __leak_canary_icon.png
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
      <string name="__leak_canary_display_activity_label">MyLeaks</string>
    </resources>

    保存 leak trace

    DisplayLeakActivity saves up to 7 heap dumps & leak traces in the app directory. You can change that number by providing R.integer.__leak_canary_max_stored_leaks in your app:

    在 APP 的目录中,DisplayLeakActivity 保存了 7 个 dump 文件和 leak trace。你可以在你的 APP 中,定义 R.integer.__leak_canary_max_stored_leaks 来覆盖类库的默认值。

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
      <integer name="__leak_canary_max_stored_leaks">20</integer>
    </resources>

    上传 leak trace 到服务器

    你可以改变处理完成的默认行为,将 leak trace 和 heap dump 上传到你的服务器以便统计分析。

    创建一个 LeakUploadService, 最简单的就是继承 DisplayLeakService :

    public class LeakUploadService extends DisplayLeakService {
      @Override
      protected void afterDefaultHandling(HeapDump heapDump, AnalysisResult result, String leakInfo) {
        if (!result.leakFound || result.excludedLeak) {
          return;
        }
        myServer.uploadLeakBlocking(heapDump.heapDumpFile, leakInfo);
      }
    }

    请确认 release 版本 使用 RefWatcher.DISABLED:

    public class ExampleApplication extends Application {
    
      public static RefWatcher getRefWatcher(Context context) {
        ExampleApplication application = (ExampleApplication) context.getApplicationContext();
        return application.refWatcher;
      }
    
      private RefWatcher refWatcher;
    
      @Override public void onCreate() {
        super.onCreate();
        refWatcher = installLeakCanary();
      }
    
      protected RefWatcher installLeakCanary() {
        return RefWatcher.DISABLED;
      }
    }

    自定义 RefWatcher:

    public class DebugExampleApplication extends ExampleApplication {
      protected RefWatcher installLeakCanary() {
        return LeakCanary.install(app, LeakUploadService.class);
      }
    }

    别忘了注册 service:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest     
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        >
         <application android:name="com.example.DebugExampleApplication">
               <service android:name="com.example.LeakUploadService" />
         </application>
    </manifest>

    demo

    一个非常简单的 LeakCanary demo: https://github.com/liaohuqiu/leakcanary-demo


    /*
    * @author zhoushengtao(周圣韬)
    * @since 2015年9月13日 下午 15:11:00
    * @weixin stchou_zst
    * @blog http://blog.csdn.net/yzzst
    * @交流学习QQ群:341989536
    * @私人QQ:445914891
    /

    展开全文
  • 内存泄漏检测工具

    万次阅读 2011-11-02 14:11:51
    内存泄漏(memory leak),指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。在编程时进行动态内存分配是非常必要的,它可以在程序运行的过程中帮助分配所需的内存,而不是在进程启动的时候就进行分配。...
    
    

    内存泄漏(memory leak),指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。

    在编程时进行动态内存分配是非常必要的,它可以在程序运行的过程中帮助分配所需的内存,而不是在进程启动的时候就进行分配。然而有效地管理这些内存同样也是非常重要的。

    在大型的、复杂的应用程序中,内存泄漏是常见的问题,当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,那么对于该进程来说,会因此导致总可用内存的减少,这时就出现了内存泄漏。


    常见检测内存泄漏的工具:


    C/C++

    1.     ValgrindDebugging and profiling Linux programs, aiming at programs written in C and C++.

    2.     ccmallocLinuxSolaris下对CC++程序的简单的使用内存泄漏和malloc调试库。

    3.     LeakTracerLinuxSolarisHP-UX下跟踪和分析C++程序中的内存泄漏。

    4.     Electric FenceLinux分发版中由Bruce Perens编写的malloc()调试库。

    5.     LeakyLinux下检测内存泄漏的程序。

    6.     DmallocDebug Malloc Library.

    7.     MEMWATCH-由Johan Lindh编写,是一个开放源代码C语言内存错误检测工具,主要是通过gccprecessor来进行。

    8.     KCachegrindA visualization tool for the profiling data generated by Cachegrind and Calltree.


    Java

    1. Memory Analyzer-是一款开源的JAVA内存分析软件,查找内存泄漏,能容易找到大块内存并验证谁在一直占用它,它是基于Eclipse RCP(Rich Client Platform),可以下载RCP的独立版本或者Eclipse的插件。

    2. JProbe-分析Java的内存泄漏。

    3. JProfiler-一个全功能的Java剖析工具,专用于分析J2SEJ2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中,GUI可以找到效能瓶颈、抓出内存泄漏、并解决执行绪的问题。

    4. JRockit-用来诊断Java内存泄漏并指出根本原因,专门针对Intel平台并得到优化,能在Intel硬件上获得最高的性能。

    5. YourKit  .NET & Java Profiling业界领先的Java.NET程序性能分析工具。

    6. AutomatedQA AutomatedQA的获奖产品performance profilingmemory debugging工具集的下一代替换产品,支持Microsoft, Borland, Intel, Compaq  GNU编译器。可以为.NETWindows程序生成全面细致的报告,从而帮助您轻松隔离并排除代码中含有的性能问题和内存/资源泄露问题。支持.Net 1.0,1.1,2.0,3.0Windows 32/64位应用程序。

    7. Compuware DevPartner Java Edition-包含Java内存检测,代码覆盖率测试,代码性能测试,线程死锁,分布式应用等几大功能模块。


    .NET

    1. .NET Memory Profiler找到内存泄漏并优化内存使用针对C#VB.Net,或其它.Net程序。

    2. Windows Leaks Detector-探测任何Win32应用程序中的任何资源泄漏(内存,句柄等),基于Win API调用钩子。

    3. DTrace一款开源动态跟踪Dynamic Tracing,能在Unix类似平台运行,用户能够动态检测操作系统内核和用户进程,以更精确地掌握系统的资源使用状况,提高系统性能,减少支持成本,并进行有效的调节。

    4. IBM Rational PurifyPlus-帮助开发人员查明C/C++、托管.NETJavaVB6代码中的性能和可靠性错误。PurifyPlus 将内存错误和泄漏检测、应用程序性能描述、代码覆盖分析等功能组合在一个单一、完整的工具包中。

    5. Parasoft Insure++-针对C/C++应用的运行时错误自动检测工具,它能够自动监测C/C++程序,发现其中存在着的内存破坏、内存泄漏、指针错误和I/O等错误。并通过使用一系列独特的技术(SCI技术和变异测试等),彻底的检查和测试我们的代码,精确定位错误的准确位置并给出详细的诊断信息。能作为Microsoft Visual C++的一个插件运行。

    6. Compuware DevPartner for Visual C++ BoundsChecker Suite-为C++开发者设计的运行错误检测和调试工具软件。作为Microsoft Visual StudioC++ 6.0的一个插件运行。

    7. Electric Software GlowCode-包括内存泄漏检查,code profiler,函数调用跟踪等功能。给C++.Net开发者提供完整的错误诊断,和运行时性能分析工具包。


    FireFox / IE

    1.  Leak Monitor-一个Firefox扩展,能找出跟Firefox相关的泄漏类型。

    2. IE Leak Detector (Drip/IE Sieve)DripIE Sieve leak detectors帮助网页开发员提升动态网页性能通过报告可避免的因为IE局限的内存泄漏。

    3. JavaScript Memory Leak Detector-微软全球产品开发欧洲团队(Global Product Development- Europe team, GPDE) 发布的一款调试工具,用来探测JavaScript代码中的内存泄漏,运行为IE系列的一个插件。

     

     

    内存泄漏的发生方式

    1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。

    2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。

    3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块且仅有一块内存发生泄漏。

    4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

     

    什么是系统资源

    当应用程序在Windows中运行时,Windows必须实时"跟踪"该应用程序的运行,并保留与之相关的许多信息,如按钮、光标、菜单的位置和位图、窗口的状况等,这些信息由Windows保留在一种叫堆的内存块中,堆的英文为Heap。简单地说,堆是采用特殊机制管理的内存块。由Windows的一个系统内核User.exe管理的堆叫做User资源堆(User Resource Heap),由另一个系统内核Gdi.exe管理的堆叫做GDI资源堆(Graphical Device Interface Resource Heap,简称GDI Resource Heap),User资源堆和GDI资源堆合称为系统资源堆(System Resource Heap),习惯上就把它们叫做系统资源(System Resource)。


    微软将Windows的系统资源(堆)分为五个堆,其中User资源堆为三个,而GDI资源堆为两个。

    三个User资源堆分别是:

    16位的用户堆(User Heap64KB);

    32位的窗口堆(Windows Heap2MB);

    32位的用户菜单堆(User Menu Heap2MB)。


    两个GDI资源堆分别是:16位的GDI堆(GDI Heap64KB);32位的GDI堆(GDI2MB)。

    从这里的系统资源分类和大小我们应该明白,不管CPUP4还是486,内存是8M还是1G,所有Windows的用户都拥有同样大小的系统资源(堆),用户不能自已增加或减少系统资源的大小,这是由操作系统决定的,与硬件档次没有任何关系。

    WindowsUser资源堆和GDI资源堆的可用(Free)空间称为可用 User资源和可用GDI资源,Windows中以百分数表示它们,用户可以选择 "开始/附件/系统工具/系统信息",来实时查看它们的大小。


    Java内存泄露的理解与解决

    Java内存溢出(OutOfMemory)工具

    展开全文
  • Android内存泄漏检测工具大全

    千次阅读 2019-07-03 16:19:41
    性能优化就得考虑使用工具进行检测,Android关于内存工具很多,要能够定位剖析问题。但是会有写场景不会覆盖到,只能发现问题的能力工具。整合下基本使用到的工具。 top/procrank STRICTMODE(楼主没有使用过) MAT...

    什么是内存泄漏?


      简单理解:没有被GC ROOT直接或者间接引用的对象的内存回收掉


    性能优化就得考虑使用工具进行检测,Android关于内存工具很多,要能够定位剖析问题。但是会有写场景不会覆盖到,只能发现问题的能力工具。整合下基本使用到的工具。


    top/procrank
    STRICTMODE(楼主没有使用过)
    MAT、Finder
    meminfo
    LeakCanary
    LeakInspector
    APT(腾讯开源:https://code.csdn.net/Tencent/apt/tree/master)
    Allocation Tracker
    Chrome Devtool 
    Systrace
    Android Architecture Components

     

     


    top/procrank

    对于此工具来讲,需要知道几个名词含义:


    VSS    Virtual Set Size       虚集合大小 
    RSS    Resident Set Size      常驻集合大小 
    PSS    Proportional Set Size  比例集合大小
    USS    Unique Set Size        独占集合大小 

     

      RSS 与 PSS 差不多,包含进程共享内存,RSS没把共享内存大小平分到使用共享的进程上,所以所有进程的RSS相加会超过物理内存。 
      VSS是虚拟地址,它上线与进程的可访问地址有关,和当前进程的内存关系不大。 
      PSS包含进程间共享的内存,而USS不包括,进程USS相加小于物理内存大小的原因。对于PSS而言,如果A进程和B进程同时共享同一个SO库,那就平分到了A和B上,但启动A进程,B没有启动,则B的PSS曲线图会有较大的阶梯状下滑。对于USS而言,它的坑在Dalvik申请内存会有GC延时及其策略,会影响曲线波动。
      
      
      VSS >= RSS >= PSS >= USS

     

     


    meminfo

     


      使用dumpsys meminfo 命令 
      用法: dumpsys meminfo options:[-a][–oom][process] 
      -h帮助信息 
      -a打印所有进程的内存信息,以及当前设备的内存概况 
      –oom 按照OOM Adj值进行排序。 
      [Process]进程名,也可以是id 
      比如:dumpsys meminfo | grep -i phone,查 phone相关进程。 
      watch -n 5 dumpsys meminfo com.android.phone 每隔5秒刷新一次

     

     


    Procsatats

     


      要提到一个公式:内存负载 = PSS X 运行时长 
      内存负载在Android4.4上提出来(App在手机设备上显示一样),分为:前台,后台,缓冲负载。 
      前台,用户当前使用的,用户不关注的,内存负载不应该默认显示。 
      后台,是app行为,系统无权kill掉并回收,并非用户当前所使用,被默认展示。 
      缓冲,可以回收,内存负载不应该默认展示,没有被杀死是软件的恢复能力,是系统的责任。

     

     


    DDMS

     

     

    (Dalvik Debug Monitor Server)

     


      各种调试信息集合,有时延,内存,线程,cpu等各种信息展示,经常使用Heap、Allocation Tracker 和 Dump Hprof file(内存快照)。

     

    Update Heap获取GC信息,当前已分配内存,当前运行的对象,所剩内存,动态虚拟机heapSize,及其分布柱状图
    Allocation Tracker , 展示了500条的内存分配,相关的线程堆栈信息。申请的内存大,GC就多,GC会挂起全部线程,会导致卡顿现象。
    Dump Hprof file,选中进程,进行内存快照,Android Studio上有此功能。

     


    MAT


      全称:Memory Analyzer(内存分析),需要抓取Hprof文件,最简单使用ddms抓取,其次就是命令


    抓取hprof命令如下(在adb shell模式下): 


    am dumpheap pid outfilePath (文件名必须为hprof)

     


     

    操作:(DDMS抓取的可以直接忽略转格式问题) 
    1. adb shell am dumpheap  com.android.phone   /data/local/tmp/test.hprof 
    2. adb pull /data/local/tmp/test.hprof c:\test.hprof 
    3. hprof-conv c:\test.hprof c:\testConv.hprof

     

    Finder


    Activity  获取dump的所有Activity对象 
    Top Classes  对象数量或对象大小为维度来获取对象降序列表
    Compare  对比两个Hprof文件内容的差别
    Bitmap 获取dump的所有bitmap对象
    Same Bytes 查询dump 中以byte[]类型出现并且内容重复的对象 
    Singleton 查询dump中的单例


    能够准确定位80%的泄漏问题 

     

    LeakCanary


      – 在onDestory 时检查弱引用,使用ReferenceQueue,白名单需要写死在AndroidExcludedRefs.java中。每次得重新编译,区分系统版本。
      
      – 能识别系统泄漏,能够给出一个分析。
      
      – 需要人工修复解决内存泄漏问题 
      
      – 使用开源组件HAHA 分析(参考简书),返回一条GC链。

     


    LeakInspector


      – 在onDestory 时检查弱引用,使用WeakReference,提供回调方法,能增加自定义的LOG,TRACE,DUMPSYS信息,需要在白名单以XML配置的形式存放到服务器上,不区分系统版本。
      
      –  可以进行预处理,在ondestroy里,通过反射自动修复系统泄漏。
      
      – 可以对对整个Activity的View遍历一遍,把图片所占用的内存数据释放掉,能够减少对内存的影响
      
      – 采集dump后,自动通过Magnifier上传dump文件,调用MAT命令进行分析,返回GC链。
      
      – 可以跟自动化测试无缝结合,自动化脚本执行过程中发现内存泄漏,收集dump发送到服务器上,分析,生成JSON结果。

     


    JHat


      Oracle公司开发的多人协作Hprof分析工具
      
      使用命令:jhat test.prof
      
      解析prof文件,开启httpSrv服务,维护解析后的数据,默认端口7000,直接访问查询。

     


    libc_malloc_deBug_leak.so库


      Android系统底层调用libc.so申请内存,而libc_malloc_deBug_leak库就是监视libc.so内部接口的调试库
      
      Native Heap 就是类内存申请部分,NDK编译出来的so文件放到系统的 /data 目录中,size字段的值就是内存大小,每一个都拥有一个申请的调用栈,根据栈后的method字段值能够知道该方法的内存偏移,使用addr2line.exe转化方法名称,注需要编译选项中加入“-Wl,-Map=xxx,map -g”

     


    APT


      腾讯开源的测试工具,是DDMS的插件,能够实时监控多个app的cpu及其内存情况,以图表形式展示出来
      
      参考官方

     


    GC Log


      Logcat输出的log日志,分为Dalvik Log和ART Log两种

     

    Dalvik GC Log


    GC 产生原因:


    GC_EXPLICIT : 通过Runtime.gc()与VMRuntime.gc(),SIGUSR1触发产生GC,支持并发GC,列表滑动,动画播放,不要有这种Log,高CPU低响应时延不要人工触发GC。
    GC_FOR_[M]ALLOC : 没有空闲内存空间给要分配的内存,不是并发GC,会有卡顿,尽量避免。
    GC_FOR_CONCURRENT : 当超过堆占用阀值时会触发,局部的并发GC 。
    GC_BEFORE_OOM : 在出发OOM前触发的GC,不能局部并发,耗时长,会卡顿。
    GC_HPROF_DUMP_HEAP : 在dump内存前触发GC,不能局部并发,耗时长,会卡顿。

     

      查看工具:Dalvik GC Log 绘制成图表的工具

     

    ART GC Log


    GC 产生原因:


    GC_EXPLICIT : 通过Runtime.gc()与VMRuntime.gc(),SIGUSR1触发产生GC,支持并发GC,列表滑动,动画播放,不要有这种Log,高CPU低响应时延不要人工触发GC。
    GC_FOR_[M]ALLOC : 没有空闲内存空间给要分配的内存,不是并发GC,会有卡顿,尽量避免。
    GC_FOR_CONCURRENT : 当超过堆占用阀值时会触发,局部的并发GC 。
    NativeAlloc : Native内存不足以分配内存时触发。
    Background : 后台GC,给后面的内存申请预留空间。


    GC 类型:


    Full : 跟Dalvik 的Full一样
    Partial: 跟Dalvik局部GC一样,没有Zygote Heap策略
    Sticky 局部中的局部GC ,上次垃圾回收后新分配的对象。


    GC 的三种方式:


    mark sweep : 记录全部对象,从GC ROOT中找出直接或间接的对象做标注,利用之前记录的全部对象和标注对象做对比,剩余的便是要回收的。
    concurrent mark sweep :  使用mark sweep的并发GC
    mark compact : 对所有活动的对象压缩到内存的一侧,另外一侧进行回收。
    semispace : 把所有引用的对象从一个空间放到另外一个空间,剩余在旧空间的对象就是要直接GC掉的。

     


    Allocation Tracker


      Android Studio 里打开Monitor,选择要查看的进程,选择Allocation Tracker,录制出结果按照Size排序,能够直接通过dump to source跳转到对应代码行。  

     


    Chrome Devtool


      需要安装Chrome浏览器,移动端和PC端,PC 端访问Chrome://inspect ,点击调试页面下的inspect,出来开发者工具
      
      官方中文文档

     


    Systrace


      Android4.1上引入的性能分析工具,能够输出各个线程的当前函数调用状态,并且可以跟当前CPU的线程运行状态、VSYNC、SurfaceFlinger等系统信息在同一时间轴上进行对比。但不是所有手机机型都能支持。
      
      SurfaceFlinger服务在每个VSYNC信号中断时调用一次,那APP显示非常流畅。
      
      如果VSYNC的上升沿SurfaceFlinger服务没有调用,那会导致丢帧。 
      (1) CPU负载过大,低端机型的单核机型上会有发生。在VSNYC中断信号处,CPU闲暇,没有执行其他进程任务时,那我们需要做进一步分析 
      (2) 应用侧没有完成绘制,应用内部处于繁忙时,查看performTraversals信息,忙于其他业务逻辑没有绘制,那看是否忙于分发响应事件。如果当前窗口视图太多,布局嵌套太深,会导致查找响应输入事件的控件耗时长,没法绘制UI。
      
      对于绘制等问题,Google添加了一些警告; 
      (1) Inefficient View alpha usage(5.1+以上才有)
      
      (2) Expensive rendering with Canvas.saveLayer()
      
      
        Canvas.saveLayer()会打断绘制过程中的渲染管道,替换使用View.LAYER_TYPE_HEARDWARE或者static Bitmaps,会让离屏缓存服用相邻两帧间的数据,避免渲染目标被切换而打断。
      
      
      (3) Path Texture Churn
      
      (4) Expensive Bitmap uploads
      
      
        Bitmaps 在硬件加速下,修改和图像的变化都会上传给GPU,如果像素总量大,会消耗GPU的较大资源,所以建议减少每帧中对图片的修改,出现调用setLayerType为LAYER_TYPE_SOFTWARE之后,此时整个屏幕变成一张图。
      
      
      (5) Inflation during ListView recycling
      
      
        没用ListView复用,造成inflate的单个Item的getView成本比较高
      
      
      (6) Inefficient ListView recycling/rebinding
      
      
        每帧的ListView recycling 耗时较长,那得看下Adapter.getView()绑定数据的时候是否存在问题
      
      
      (7) Expensive Measure/Layout pass
      
      
        Measure / Layout 耗时导致卡顿,动画时,不要触发Layout
      
      
      (8) Long View.draw()
      
      
        Draw 本身耗时比较长,避免在View 或 Drawable 的onDraw里面执行任务频繁自定义操作,特别时申请内存和绘制Bitmap.
      
      
      (9) Blocking Garbage Collection
      
      
        GC导致卡顿,就是GC for Alloc的stop the world,避免在动画的时候生成对象,尽量重用Bitmap能够避免触发GC。
      
      
      (10) Lock contention
      
      
        UI 线程锁,UI线程去使用其他线程持有的锁,检查现有UI线程锁并确认它锁住的时间长短。
      
      
      (11)  Scheduling delay
      
      
        网络I/O、磁盘I/O 等线程资源争抢,导致有一定时间的UI线程实际耗时长,而卡顿,检查后台线程是否都云溪nag在低优先级的线程上(是否比Thread_Priority_background还低)。
      

     


    Android Architecture Components


      Android 架构组件
      
      存储数据,管理生命周期,模块化,避免常见错误,减少样板文件
      
      
        Lifecycles
      
      
      每个 Android 开发者都应该面对过生命周期问题,即操作系统启动、停止和销毁 Activity。这意味着开发者需要根据生命周期的不同阶段,有针对性地管理组件状态,比如用于更新用户界面的可观察对象。生命周期管理(Lifecycles)帮助开发者创建 “可感知生命周期的” 组件,让其自己管理自己的生命周期,从而 减少内存泄露 和崩溃的可能性。生命周期库是其他架构组件(如 LiveData)的基础。
      
      
        LiveData     
      
      
      LiveData 是一款基于观察者模式的可感知生命周期的核心组件。一种可观测数据容器,它会在数据变化时通知观测器,以便更新界面。
      
      LiveData 为界面代码 (Observer)的监视对象 (Observable),当 LiveData 所持有的数据改变时,它会通知相应的界面代码进行更新。同时,LiveData 持有界面代码 Lifecycle 的引用,这意味着它会在界面代码(LifecycleOwner)的生命周期处于 started 或 resumed 时作出相应更新,而在 LifecycleOwner 被销毁时停止更新。通过 LiveData,开发者可以方便地构建安全性更高、性能更好的高响应度用户界面。
      
      有两个对应接口,LifecycleOwner和LifecycleObserver; 
      LifecycleOwner是具有生命周期的对象,比如Activity和Fragment. 
      LifecycleObserver观测LifecycleOwner,并在生命周期变化时收到通知。
      
      
        ViewModel     
      
      
      ViewModel 将视图的数据和逻辑从具有生命周期特性的实体(如 Activity 和 Fragment)中剥离开来。直到关联的 Activity 或 Fragment 完全销毁时,ViewModel 才会随之消失,也就是说,即使在旋转屏幕导致 Fragment 被重新创建等事件中,视图数据依旧会被保留。ViewModels 不仅消除了常见的生命周期问题,而且可以帮助构建更为模块化、更方便测试的用户界面。
      
      
        Room
      
      
      一款简单好用的SQL对象映射库。它和 SQLite 有一样强大的功能,但是节省了很多重复编码的麻烦事儿。它的一些功能,如编译时的数据查询验证、内置迁移支持等,更简单地构建健壮的持久层。而且 Room 可以和 LiveData 集成在一起,提供可观测数据库并感知生命周期的对象。Room 集简洁、强大和可靠性为一身,在管理本地储存上表现卓越。
      
      
        PagedList
      
      
      解决用 RecyclerView 处理大数据集的困难。
      
      App 架构指南 
      Android 架构组件官网

     

     


    参考博客地址:

    开源项目之LeakCanary源码分析: http://www.jianshu.com/p/5032c52c6b0a

    查找并修复Android中的内存泄露—OutOfMemoryError: 
    https://yq.aliyun.com/articles/40294

    内存分析工具 MAT 的使用 :  
    http://blog.csdn.net/aaa2832/article/details/19419679

    Android 查看内存使用工具 (procstats): 
    http://blog.csdn.net/vshuang/article/details/51755756

    Android进程内存统计工具procstats: 
    https://wenku.baidu.com/view/c8d49549b90d6c85ed3ac63b.html
    --------------------- 
    作者:jink_l 
    来源:CSDN 
    原文:https://blog.csdn.net/superloveboy/article/details/78536750 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 内存泄露检测工具比较

    千次阅读 2012-06-01 23:57:03
    内存泄露检测工具比较 2009年09月17日 星期四 上午 12:12 1.  ccmalloc-Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库。 2.  Dmalloc-Debug Malloc Library. 3. ...
  • 内存泄漏检测工具

    千次阅读 2004-12-23 11:59:00
    文/Peter Jiang(译自newlc.com)检测已分配资源 第一个工具是一个内存资源使用的监听器.它只能在模拟器上进行调试.可以使用快捷键来调用 按键 功能 CTRL+ALT+SHIFT+A显示已分配堆单元的数量 CTRL+ALT+SHIFT+B显示已...
  • 常用内存泄漏检测工具

    千次阅读 2006-09-12 15:34:00
    常用内存泄漏检测工具一、检测已经分配的资源:内存资源使用监听器,只能用在模拟器上:按键组合 功能CTRL+ALT+SHIFT+A 显示已分配堆单元的数量CTRL+ALT+SHIFT+B 显示已分配的文件服务器资源的数量CTRL+ALT+SHIFT...
  • 内存泄露检测工具

    千次阅读 2012-10-30 13:20:32
    一、什么是内存泄露? 在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的...
  • 非托管代码如果没有处理得当程序将失去内存的可控,造成垃圾内存堆积,阻塞系统,以至于当机等等情况,下面介绍下内存泄漏及一些常见的内存泄漏检测工具: 一、什么是内存泄露? 在计算机科学中,内存泄漏指...
  • 应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。以下这段小程序演示了堆...
  • 几种内存泄露检测工具的比较

    万次阅读 2019-05-28 16:25:28
    内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况,在大型的、复杂的应用程序中,内存泄漏是常见的问题。当以前分配的一片内存不再需要使用或无法访问时,但是却并没有释放它,这时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 130,948
精华内容 52,379
关键字:

服务器内存检测工具