精华内容
下载资源
问答
  • android内存分析工具MAT使用 当遇到OutOfMemory问题的时候,怎么样通过MAT来定位和分析问题呢?先看个例子: public class MemoryLeakActivity extends AppCompatActivity{ @Override protected void ...

    android内存分析工具MAT的使用

    当遇到OutOfMemory问题的时候,怎么样通过MAT来定位和分析问题呢?先看个例子:

    public class MemoryLeakActivity extends AppCompatActivity{
      @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_memory_leak);
    
        handler.sendEmptyMessageDelayed(0, 10000);
      }
    
      Handler handler = new Handler() {
        @Override public void handleMessage(Message msg) {
          super.handleMessage(msg);
        }
      };
    }

    代码中内存泄露的原因是匿名内部类创建的对象hander持有外部activity的引用,导致activity无法及时销毁。
    我们来做个简单的测试,先运行程序,启动和退出MemoryLeakActivity三次,然后点击卡车icon触发GC释放内存,再点击Dump Java Heap按钮,生成xxx.hprof文件,如下图:
    SouthEast

    SouthEast

    生成xxx.hprof文件后,点击右侧Analyser Tasks分析是否存在内存泄露问题,如下图:
    SouthEast

    我们发现MemoryLeakActivity存在内存泄露的问题,可是具体什么原因导致MemoryLeakActivity内存泄露呢?MAT这个时候可以登场了,首先对xx.hprof文件格式转化下,否则MAT无法识别,当然如果你用的是eclipse,并且安装了mat插件,应该是不用转换也能识别的,这里以AndroidStudio为例,我们先转换下hprof文件格式,如下图。
    SouthEast

    MAT上哪找呢?下载地址:http://www.eclipse.org/mat/downloads.php
    按装启动MAT后,打开格式转换后的xx.hprof文件,点开Histogram查看对象数量和分配的内存大小,理解下Shallow Heap & Retained Heap这两个概念:

    • Shallow Heap
      是对象本身占据的内存的大小,不包含其引用的对象
    • Retained Heap
      当前对象大小+当前对象可直接或间接引用到的对象的大小总和

    SouthEast

    在ClassName一列输入关键字检索MemoryLeakActivity,查找MemoryLeakActivity被哪些对象引用,这里又要了解下:

    • with incoming references
      显示选中对象被哪些对象持有
    • with outgoing references
      显示选中对象持有了哪些外部对象

    这里我们选择with incoming references,查看MemoryLeakActivity被哪些对象持有,导致MemoryLeakActivity无法正常销毁。

    SouthEast

    检索出3个MemoryLeakActivity对象,和之前启动3次对应,正常情况下是Activity调用onDestory后被系统回收,可是3个MemoryLeakActivity都在,选择其中一个Activity按照下图操作,检索与RC Roots关联的引用,虚/软/弱引用除外。

    内存泄露的本质是:当对象逻辑上需要被销毁,却仍然和RC Roots存在引用链关系,导致GC无法回收

    SouthEast

    终于找到了,handle持有activity引用导致的内存泄露。

    SouthEast


    下面再补充下解决方法(静态内部类+弱引用):

    public class MemoryLeakActivity extends AppCompatActivity{
      @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_memory_leak);
    
        handler.sendEmptyMessageDelayed(0, 10000);
      }
    
     static class MyHander extends Handler {
    
        WeakReference<Activity> activityWeakReference;
        public MyHander(Activity activity) {
          activityWeakReference = new WeakReference<Activity>(activity);
        }
        @Override public void handleMessage(Message msg) {
          super.handleMessage(msg);
        }
      }
    }
    展开全文
  • mat分析工具使用

    2020-01-06 02:17:58
    MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件。但是比较主流的厂家和格式,例如 Sun, HP, SAP 所采用的 HPROF 二进制堆存储文件,以及 IBM 的 PHD 堆存储文件等都能被很好的解析。下面来看看要怎么做呢...

        MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件。但是比较主流的厂家和格式,例如 Sun, HP, SAP 所采用的 HPROF 二进制堆存储文件,以及 IBM 的 PHD 堆存储文件等都能被很好的解析。下面来看看要怎么做呢,也许对你有用。官方文档:http://help.eclipse.org/luna/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html

    造成OutOfMemoryError原因一般有2种:

    1、内存泄露,对象已经死了,无法通过垃圾收集器进行自动回收,通过找出泄露的代码位置和原因,才好确定解决方案;
    2、内存溢出,内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生命周期太长、持有状态时间过长的情况。

     

    1. 用jmap生成堆信息

    这样在E盘的jmap文件夹里会有一个map.bin的堆信息文件 

    2. 将堆信息导入到mat中分析   

     

    3. 生成分析报告

        mat可以为我们生成多个报告:

            

            

     

        下面来看看生成的这些数据对我们有什么帮助

        

        从上图可以看到它的大部分功能,在饼图上,你会发现转储的大小和数量的类,对象和类加载器。
    正确的下面,饼图给出了一个印象最大的对象转储。移动你的鼠标一片看到对象中的对象的细节检查在左边。下面的Action标签中:

        • Histogram可以列出内存中的对象,对象的个数以及大小。

  • Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。

  • Top consumers通过图形列出最大的object。

  • Leak Suspects通过MA自动分析泄漏的原因。

  • Histogram

        

    • Class Name : 类名称,java类名

  • Objects : 类的对象的数量,这个对象被创建了多少个

  • Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用

    • Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收到内存的总和

     


    一般来说,Shallow Heap堆中的对象是它的大小和保留内存大小相同的对象是堆内存的数量时,将释放对象被垃圾收集。
    保留设置一组主要的对象,例如一个特定类的所有对象,或所有对象的一个特定的类装入器装入的类或者只是一群任意对象,是释放的组对象如果所有对象的主要设置变得难以接近的。保留设置包括这些对象以及所有其他对象只能通过这些对象。保留大小是总堆大小中包含的所有对象的保留。摘自eclipse


    关于的详细讲解,建议大家查看Shallow heap & Retained heap,这是个很重要的概念。

    这儿借助工具提供的regex正则搜索一下我们自己的类,排序后看看哪些相对是占用比较大的。

    左边可以看到类的详细使用,比如所属包,父类是谁,所属的类加载器,内存地址,占用大小和回收情况等

    这儿有个工具可以根据自己的需求分组查找,默认根据class分组,类似我们sql里的group by了~~

    这里可以看到上面3个选项,分别生成overview、leak suspects、top components数据,但是这儿生成的不是图表,如果要看图表在(Overview)中的Action标签里点击查看。

    这个是Overview中的 Heap Dump Overview视图,从工具栏中点开,这是一个全局的内存占用信息

    Used heap dump 79.7 MB
    Number of objects 1,535,626 Number of classes 8,459 Number of class loaders 74 Number of GC roots 2,722 Format hprof JVM version   Time 格林尼治标准时间+0800上午9时20分37秒 Date 2014-7-2 Identifier size 32-bit File path E:\jmap\map.bin File length 108,102,005
    • Total: 12 entries

     

    然后可以点开SystemProperties和Thread Overview进行查看,我这里就不贴了内容比较多。

    Dominator Tree

    我们可以看到ibatis占了较多内存

    Top consumers

    这张图展示的是占用内存比较多的对象的分布,下面是具体的一些类和占用。

    按等级分布的类使用情况,其实也就是按使用次数查看,java.lang.Class被排在第一

    还有一张图是我们比较关心的,那就是按包名看占用,根据包我们知道哪些公共用的到jar或自己的包占用

    这样就可以看到包和包中哪些类的占用比较高。

    Leak Suspects

    从这份报告,看到该图深色区域被怀疑有内存泄漏,可以发现整个heap只有79.7M内存,深色区域就占了62%。所以,MAT通过简单的报告就说明了项目是有可疑代码的,具体点开详情来找到类,

    点击鼠标,在List Objects-> with outgoing references下可以查看该类都引用了什么对象,由此查看是否因为其他对象导致的内存问题。

    下面继续查看pool的gc ROOT

    如下图所示的上下文菜单中选择 Path To GC Roots -> exclude weak references, 过滤掉弱引用,因为在这里弱引用不是引起问题的关键。

    进入查看即可,我这儿的代码没有问题,就不用贴了。


    The classloader/component "org.apache.catalina.loader.WebappClassLoader @ 0xa34cde8" occupies 19,052,864 (22.80%) bytes. The memory is accumulated in one instance of "java.util.HashMap$Entry[]" loaded by "<system class loader>".

    Keywords
    java.util.HashMap$Entry[]
    org.apache.catalina.loader.WebappClassLoader @ 0xa34cde8


    这段话是在工具中提示的,他告诉我们WebappClassLoader占了19,052,864 字节的容量,这是tomcat的类加载器,JDK自带的系统类加载器中占用比较多的是HashMap。这个其实比较正常,大家经常用map作为存储容器。

    除了在上一页看到的描述外,还有Shortest Paths To the Accumulation Point和Accumulated Objects部分,这里说明了从GC root到聚集点的最短路径,以及完整的reference chain。观察Accumulated Objects部分,java.util.HashMap的retained heap(size)最大,所以明显类实例都聚集在HashMap中了。

    来看看Accumulated Objects by Class区域,这里能找到被聚集的对象实例的类名。java.util.HashMap类上头条了,被实例化了5573次,从这儿看出这个程序不存在什么问题,因为这个数字是比较正常的,但是当出问题的时候我们都会看到比较大的自定义类会在前面,而且占用是相当高。

    当然,mat这个工具还有很多的用法,这里把我了解的分享给大家,不管如何,最终我们需要得出系统的内存占用,然后对其进行代码或架构,服务器的优化措施!

    参考文献:

    http://www.eclipse.org/mat/about/screenshots.php

    http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/

    展开全文
  • 展开全部python中读取2113mat文件在python中可以使用scipy.io中的5261函数4102loadmat()读取mat文件,函数savemat保存文件。1、读取文件如上例1653:1234567#coding:UTF-8 import scipy.io as scio dataFile = 'E://...

    展开全部

    python中读取2113mat文件

    在python中可以使用scipy.io中的5261函数4102loadmat()读取mat文件,函数savemat保存文件。

    1、读取文件

    如上例1653:

    1234567

    #coding:UTF-8 import scipy.io as scio dataFile = 'E://data.mat'data = scio.loadmat(dataFile)

    注意,读取出来的data是字典格式,可以通过函数type(data)查看。

    1

    print type(data)

    结果显示

    1

    找到mat文件中的矩阵:

    1

    print data['A']

    结果显示

    [[ 0. 0. 0. 0. 0. 0. 0.

    0. 0. 0. 0. 0. 0. 0.

    。。。。。。。。。。。

    0. 0. 0. 0. 0. 0. 0.

    0.36470588 0.90196078 0.99215686 0.99607843 0.99215686 0.99215686

    0.78431373 0.0627451 0. 0. 0. 0. 0.

    0. 0. 0. 0. 0. 0. 0.

    。。。。。。。。。。。。

    0.94117647 0.22745098 0. 0. 0. 0. 0.

    0. 0. 0. 0. 0. 0. 0.

    0. 0. 0. 0. 0. 0. 0.

    0. 0. 0. 0. 0. 0.30196078

    。。。。。。。

    0. 0. 0. 0. 0. 0. 0.

    0. 0. 0. 0. 0. 0. 0. ]]

    格式为:

    即为numpy中的矩阵格式。

    2Q==

    已赞过

    已踩过<

    你对这个回答的评价是?

    评论

    收起

    展开全文
  • 在编程中,使用.mat文件可以连同数据的变量名一同保存下来,在程序调试的过程中十分方便,并且不需要控制数据的存储格式,matlab会自动保存并区分我们所存储的内容。那你知道如何使用python打开.mat文件吗?本文介绍...

    cfcd42a209e7aa0098974996bf330321.png

    在编程中,使用.mat文件可以连同数据的变量名一同保存下来,在程序调试的过程中十分方便,并且不需要控制数据的存储格式,matlab会自动保存并区分我们所存储的内容。那你知道如何使用python打开.mat文件吗?本文介绍三种打开mat文件的方法:1、使用sicpy.io模块;2、使用mat4py库;3、保存大文件的格式,使用h5py。

    方法一:使用sicpy.io模块import scipy.io as scio

    import pandas as pd

    data_path="train.mat"

    #Method 1

    data = scio.loadmat(data_path)

    data_train_label=data_train.get('label')#取出字典里的label

    data_train_data=data_train.get('data')#取出字典里的data

    方法二:mat4py库

    功能: 将Matlab 数据导入为基本的Python数据类型。矩阵是以行为组的存储方式(使用列表的列表)。import mat4py

    mat4py.loadmat(mat_path)

    方法三:h5py

    -v7.3版本的.mat文件是matlab中保存大文件的格式,使用上面的方式是无法读取的,这个时候需要使用h5py。import h5py

    data = h5py.File('data.mat')

    以上就是python中打开mat文件的三种方法,若要保存大文件格式的时候,推荐使用h5py方法哦~

    展开全文
  • 在编程中,使用.mat文件可以连同数据的变量名一同保存下来,在程序调试的过程中十分方便,并且不需要控制数据的存储格式,matlab会自动保存并区分我们所存储的内容。那你知道如何使用python打开.mat文件吗?本文介绍...
  • mat使用分两步,第一获取hprof类型文件,第二转换成mat.hprof类型文件。 //第一步 使用AS(建议版本3.0以上,模拟器26以上),点击profile运行程序,效果如下。 //可以分析很多数据,比如耗电,内存...今天...
  • 匿名用户1级2017-11-04 回答python中读取mat文件在python中可以使用scipy.io中的函数loadmat()读取mat文件,函数savemat保存文件。1、读取文件如上例:1234567#coding:UTF-8 import scipy.io as scio dataFile = 'E:...
  • ##1.MAT工具的下载和安装MAT(Memory Analyzer Tool)工具是eclipse的一个插件,使用起来非常方便,尤其是在分析 大内存的dump文件时,可以非常直观的看到各个对象在堆空间中所占用的内存大小、类实例数量、对象引用...
  • def show(self, frame): cv2.imshow(self._windowName, frame) ``` ``` 是什么原因呢?感觉imshow要的两个参数都有了,网上好像很少人遇到这个问题,没有搜到可解决的方案
  • 和其他内存泄露分析工具相比,MAT使用非常容易,基本可以实现一键到位,即使是新手也能够很快上手使用MAT使用是如此容易,你是不是也很有兴趣来亲自感受下呢,那么第一步我们先来安装 MAT。 准备环境...
  • MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件。但是比较主流的厂家和格式...下面来看看要怎么做呢,也许对你有用。官方文档:http://help.eclipse.org/luna/index.jsp?topic=/org.eclipse.mat.ui.help...
  • MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件。但是比较主流的厂家和格式...下面来看看要怎么做呢,也许对你有用。官方文档:http://help.eclipse.org/luna/index.jsp?topic=/org.eclipse.mat.ui.help/...
  • 但是怎么都无法把照片写入到视频中,我就纳闷了,用普通的电脑自带的摄像头是可以存取视频的,怎么换成zed拍的照片就不行了。明明存视频的过程就是简单的把照片合在一起呀。 然后我在这里发现了突破点 bool isColor ...
  • 在java应用开发中 我们难免会遇到java stack和heap的分析,在此记录一下对于发生OOM时候,该怎么进行分析 分析 首先我们得会几个工具, jps jmap -heap jmap -histo:live jmap -dump:format=b,file=dump.hprof mat...
  • 1、定义 unsignde char* A;...3、使用c语言的 memcpy(B.data, A,800*500)//将A指针的数据复制到B中的数据内存,并且给出内存大小 4最后unsignde char 类型数据就会被转化为Mat类型,并且可以显示出来 ...
  • 下面来看看要怎么做呢,也许对你有用。官方文档:http://help.eclipse.org/luna/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html 造成OutOfMemoryError原因一般有2种: 1、内存泄露,对象已经..
  • 还是用最新C++版本的Mat类型,在创建和使用过程中,经常会遇到CV_8UC1、CV_8UC3、CV_32FC3等声明,我以前也经常遇到,曾经看懂了,现在又忘记了,现在把它写下来,方便以后查看,遇到同样问题的菜鸟也能尽快理解这些...
  • 还是用最新C++版本的Mat类型,在创建和使用过程中,经常会遇到CV_8UC1、CV_8UC3、CV_32FC3等声明,我以前也经常遇到,曾经看懂了,现在又忘记了,现在把它写下来,方便以后查看,遇到同样问题的菜鸟也能尽快理解这些...
  • 本文主要介绍python中的变量(list, dict, ndarray 类型)怎么保存为.mat文件( matlab 使用)方法:使用scipy库中的scipy.io.savemat(savePath, maydict={…})函数import scipy.ioimport ............#假设你要...
  • opencv mat操作总结

    千次阅读 2019-07-05 11:24:12
    现在一写代码就忘了怎么赋值、怎么取元素,还是写得太少。现把目前用到的总结一下。 文章目录Mat 访问元素矩阵显示函数Mat 初始化数据类型列向量转换成对角向量转置求逆SVD加减乘除加...使用Mat的成员函数at<&...
  • MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件。但是比较主流的厂家和格式...下面来看看要怎么做呢,也许对你有用。官方文档:http://help.eclipse.org/luna/index.jsp?topic=/org.eclipse.mat.ui.help/...
  • 无论怎么小心,想完全避免badcode是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方。Androidtools中的DDMS就带有一个很不错的内存监测工具Heap(这里我使用eclipse的ADT插件,并以...
  • 至于怎么配置好的,有其他的信息可以找到。或者改天给写出来。 为了显示图片,看有的人使用qlabel,这个就不必过多描述,除了能显示,并不能做别的事情。Qt下正儿八经显示的方法还是qpainter。这个是做绘图板用的,...
  • python里面的matplotlib....我把常用函数作了一个总结,最后写了一个例子,以后基本不用怎么改了。一、作图流程:1.准备数据, , 3作图, 4定制, 5保存, 6显示1.数据可以是numpy数组,也可以是list2创建画布:...
  • 内存泄漏这个名词我想大家都不陌生,但是真正注意到这个问题并去解决的估计很少,因为内存泄漏表面上并不会表现出对app的任何影响,加之现在的手机配置与内存都挺高的,所以对于中小型app来说,可能不怎么去处理也...
  • Simulink是MATLAB的一个集成工具箱,用于系统的建模与仿真,与MATLAB不同的是Simulink的图形化编程功能,但是使用Simulink的时候,有时候需要和MATLAB进行数据交互,本文就介绍Simulink和MATLAB数据交互的两种方法。...
  • 最近因项目原因,开始关注内存管理这块的东西,由于之前没怎么了解这块,刚开始不知道怎么下手,后来发现MAT这个工具,就搜了一些资料,下面是关于MAT使用的一些 方法   准备 (·)下载eclipse3.7 (·)...
  • MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件。但是比较主流的厂家和格式...下面来看看要怎么做呢,也许对你有用。官方文档:http://help.eclipse.org/luna/index.jsp?topic=/org.eclipse.mat.ui.help/...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 254
精华内容 101
关键字:

mat怎么使用