精华内容
下载资源
问答
  • valgrind检查内存泄露命令

    千次阅读 2011-07-08 15:35:13
    REPDIR=$(pwd)valgrind --tool=memcheck --log-file=./test.log --leak-check=yes --track-origins=yes ./test valgrind --tool=memcheck --log-file
    REPDIR=$(pwd)
    


    valgrind --tool=memcheck --log-file=./test.log --leak-check=yes  --track-origins=yes ./test 
    valgrind --tool=memcheck --log-file=./demotest.log --leak-check=yes --run-libc-freeres=no --suppressions=dmt.supp  --track-origins=yes ./demotest --gtest_output=xml:./DTCenter_demotest.xml


    python ../../tools/valgrind/genmemcheckxml.py -d .
    展开全文
  • #内存泄露# linux常用内存相关命令

    万次阅读 2020-06-19 11:14:34
     free 命令会显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存等。 $ free total used free shared buff/cache available Mem: 8047480 6142828 154116 465584 1750536 1078080 Swap: ...

    Table of Contents

    free命令

    vmstat命令

    top命令

    cat /proc/meminfo

    ps aux命令


    free命令

      free 命令会显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存等。

    $ free
                  total        used        free      shared  buff/cache   available
    Mem:        8047480     6142828      154116      465584     1750536     1078080
    Swap:       8267772     1446400     6821372
    

    释义:

      Mem:内存使用情况。

      Swap:交换空间(虚拟内存)使用情况。

      total:系统总共可用物理内存、交换空间大小。

      used:已经被使用的物理内存、交换空间大小。

      free:剩余可用物理内存、交换空间大小。

      shared:被共享使用的物理内存大小。

      buff/cache:被 buffer 和 cache 使用的物理内存大小。

      available:还可以被应用程序使用的物理内存大小。

    
    free
                 total       used       free     shared    buffers     cached
    Mem:        601064     482856     118208      32648       1748     207788
    -/+ buffers/cache:     273320     327744
    Swap:            0          0          0
    

     释义:

    Mem行: 显示物理内存情况。

    列名含义
    total内存总量
    used使用内存
    free可用内存
    shared共享内存
    buffersbuffer缓存,可回收
    cachedcached缓存,可回收

    -/+buffers/cache行: 显示基于应用角度考虑的内存情况,也可理解为真实的内存使用情况。(计算已使用内存时减去buffers/cache,计算可使用内存时加上buffers/cache。)这里的buffers指Buffer cache(缓冲区缓存),cache指Page cache(页面缓存)。在当前的Linux内核中,Page cache是针对内存页的缓存。也就是说,如果有内存是以page进行分配管理的,都可以使用Page cache作为其缓存来管理使用。当然,不是所有的内存都是以页(page)进行管理的,也有很多是针对块(block),这部分内存使用如果要用到cache功能,则都集中到buffer cache中来使用。

    列名含义
    used实际使用内存
    free实际可用内存

      Mem行和buffers/cache行的各列计算关系如下:(M代表Mem行,B代表buffers/cache行)

    total(M) = used(m) + free(m)
    total(M) = used(B) + free(B) 
    used(M) = used(B) + buffers(M) + cached(M)
    free(B) = free(M) + buffers(M) + cached(M)

    Swap行: 显示交换空间使用情况,交换空间(swap space)是磁盘上的一块区域,可以是一个分区,也可以是一个文件。当系统物理内存吃紧时,Linux 会将内存中不常访问的数据保存到 swap 上,这样系统就有更多的物理内存为各个进程服务。而当系统需要访问swap上存储的内容时,再将swap 上的数据加载到内存中,这就是常说的换出和换入。交换空间可以在一定程度上缓解内存不足的情况,但是它需要读写磁盘数据,所以性能不是很高。

    列名含义
    used实际使用内存
    free实际可用内存

    free 命令中的信息都来自于 /proc/meminfo 文件。见cat /proc/meminfo

     

    常见用法:

    • free -k:按照g的计数方式来显示内存信息。
    • free -m:按照m的计数方式来显示内存信息。
    • free -g:按照g的计数方式来显示内存信息。
    • free -t:按照总和的形式显示内存的使用信息。
    • free -s 5:周期性展示内存使用情况,意思为每隔5秒统计展示,直到我们按下ctrl +c 键取消统计为止。
    • free -s 2 -c 4:周期性展示统计内存信息。本篇实例为每隔2秒统计一次,统计4次。
    • free -V:查看版本信息
    $ free --help
    
    Usage:
     free [options]
    
    Options:
     -b, --bytes         show output in bytes
     -k, --kilo          show output in kilobytes
     -m, --mega          show output in megabytes
     -g, --giga          show output in gigabytes
         --tera          show output in terabytes
     -h, --human         show human-readable output
         --si            use powers of 1000 not 1024
     -l, --lohi          show detailed low and high memory statistics
     -t, --total         show total for RAM + swap
     -s N, --seconds N   repeat printing every N seconds
     -c N, --count N     repeat printing N times, then exit
     -w, --wide          wide output
    
         --help     display this help and exit
     -V, --version  output version information and exit
    
    For more details see free(1).

    vmstat命令

      vmstat 是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控,是对系统的整体情况进行的统计。

    $ vmstat 
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
     r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
     1  0 338176 143144 384176 2212096    0    0    43    19    3   25  3  1 96  0  0

    Procs(进程):

      r: 运行队列中进程数量

      b: 等待IO的进程数量

    Memory(内存):

      swpd: 使用虚拟内存大小

      free: 可用内存大小

      buff: 用作缓冲的内存大小

      cache: 用作缓存的内存大小

    Swap:

      si: 每秒从交换区写到内存的大小

      so: 每秒写入交换区的内存大小

    IO:(现在的Linux版本块的大小为1024bytes)

      bi: 每秒读取的块数

      bo: 每秒写入的块数

    系统:

    in: 每秒中断数,包括时钟中断。【interrupt】

    cs: 每秒上下文切换数。        【count/second】

    CPU(以百分比表示):

      us: 用户进程执行时间(user time)

      sy: 系统进程执行时间(system time)

      id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。

      wa: 等待IO时间

    常见用法:

    • vmstat 1    //每隔1s打印一次
    • vmstat 1 5   //每隔1秒打印一次,打印五次
    • vmstat -s    //显示内存相关统计信息及多种系统活动数量
    $ vmstat --help
    
    Usage:
     vmstat [options] [delay [count]]
    
    Options:
     -a, --active           active/inactive memory
     -f, --forks            number of forks since boot
     -m, --slabs            slabinfo
     -n, --one-header       do not redisplay header
     -s, --stats            event counter statistics
     -d, --disk             disk statistics
     -D, --disk-sum         summarize disk statistics
     -p, --partition <dev>  partition specific statistics
     -S, --unit <char>      define display unit
     -w, --wide             wide output
     -t, --timestamp        show timestamp
    
     -h, --help     display this help and exit
     -V, --version  output version information and exit
    
    For more details see vmstat(8).

    top命令

      使用top命令,可以查看正在运行的进程和系统负载信息,包括cpu负载、内存使用、各个进程所占系统资源等,top命令以一定频率动态更新这些统计信息。

    $ top
    
    top - 11:06:47 up 3 days, 19:00,  7 users,  load average: 0.18, 0.21, 0.15
    Tasks: 280 total,   1 running, 225 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 10.4 us,  1.0 sy,  0.0 ni, 88.2 id,  0.1 wa,  0.0 hi,  0.3 si,  0.0 st
    KiB Mem :  8047472 total,   142028 free,  5307464 used,  2597980 buff/cache
    KiB Swap:  8267772 total,  7929596 free,   338176 used.  1780512 avail Mem 
    
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                         
    10335 cll       20   0  214088  79724   4720 S  34.9  1.0  56:57.82 synergyc                                        
     1039 root      20   0  584644 217704 168232 S   3.0  2.7  59:35.71 Xorg                                            
     4697 root      20   0 1231768  35196   4216 S   2.7  0.4 216:14.55 vmware-hostd                                    
     1563 cll       20   0 1514936  86452  27684 S   2.3  1.1 123:58.21 compiz                                          
    29317 cll       20   0  642576  50860  20452 S   1.3  0.6  10:24.93 /usr/bin/x-term                                 
    18307 root      20   0       0      0      0 I   0.7  0.0   0:05.73 kworker/1:2                                     
      799 avahi     20   0   45572   3868   2912 S   0.3  0.0  24:05.96 avahi-daemon                                    
     2245 cll       20   0 1928640 218216  42808 S   0.3  2.7   8:18.58 TeamViewer                                      
     8399 root      20   0   15236   3844   2668 S   0.3  0.0   3:34.23 sh                                              
    20069 cll       20   0   43676   3708   3000 R   0.3  0.0   0:00.07 top                                             
    31219 cll       20   0  825672 232332  32188 S   0.3  2.9   8:05.88 code                                            
        1 root      20   0  185460   4692   2904 S   0.0  0.1   0:07.57 systemd                                         
        2 root      20   0       0      0      0 S   0.0  0.0   0:00.43 kthreadd                                        
        4 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 kworker/0:0H                                    
        6 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 mm_percpu_wq                                    
        7 root      20   0       0      0      0 S   0.0  0.0   0:03.95 ksoftirqd/0                                     
        8 root      20   0       0      0      0 I   0.0  0.0   9:40.74 rcu_sched                                       
        9 root      20   0       0      0      0 I   0.0  0.0   0:00.00 rcu_bh                                          
       10 root      rt   0       0      0      0 S   0.0  0.0   0:00.17 migration/0                                     
       11 root      rt   0       0      0      0 S   0.0  0.0   0:01.26 watchdog/0                                      
       12 root      20   0       0      0      0 S   0.0  0.0   0:00.00 cpuhp/0                                         
       13 root      20   0       0      0      0 S   0.0  0.0   0:00.00 cpuhp/1                                         
       14 root      rt   0       0      0      0 S   0.0  0.0   0:01.31 watchdog/1                                      
       15 root      rt   0       0      0      0 S   0.0  0.0   0:00.23 migration/1                                     
       16 root      20   0       0      0      0 S   0.0  0.0   0:07.94 ksoftirqd/1                                     
       18 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 kworker/1:0H                                    
    

    VIRT:virtual memory usage 虚拟内存
    1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
    2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量

    RES:resident memory usage 常驻内存
    1、进程当前使用的内存大小,但不包括swap out
    2、包含其他进程的共享
    3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
    4、关于库占用内存的情况,它只统计加载的库文件所占内存大小

    SHR:shared memory 共享内存
    1、除了自身进程的共享内存,也包括其他进程的共享内存
    2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
    3、计算某个进程所占的物理内存大小公式:RES – SHR
    4、swap out后,它将会降下来

    DATA
    1、数据占用的内存。如果top没有显示,按f键可以显示出来。
    2、真正的该程序要求的数据空间,是真正在运行中要使用的。

    top 运行中可以通过 top 的内部命令对进程的显示方式进行控制。内部命令如下:

    • s – 改变画面更新频率
    • l – 关闭或开启第一部分第一行 top 信息的表示
    • t – 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
    • m – 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
    • N – 以 PID 的大小的顺序排列表示进程列表
    • P – 以 CPU 占用率大小的顺序排列进程列表
    • M – 以内存占用率大小的顺序排列进程列表
    • h – 显示帮助
    • n – 设置在进程列表所显示进程的数量
    • q – 退出 top
    • s – 改变画面更新周期

    序号 列名 含义

    • a PID 进程id
    • b PPID 父进程id
    • c RUSER Real user name
    • d UID 进程所有者的用户id
    • e USER 进程所有者的用户名
    • f GROUP 进程所有者的组名
    • g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
    • h PR 优先级
    • i NI nice值。负值表示高优先级,正值表示低优先级
    • j P 最后使用的CPU,仅在多CPU环境下有意义
    • k %CPU 上次更新到现在的CPU时间占用百分比
    • l TIME 进程使用的CPU时间总计,单位秒
    • m TIME+ 进程使用的CPU时间总计,单位1/100秒
    • n %MEM 进程使用的物理内存百分比
    • o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
    • p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
    • q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
    • r CODE 可执行代码占用的物理内存大小,单位kb
    • s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
    • t SHR 共享内存大小,单位kb
    • u nFLT 页面错误次数
    • v nDRT 最后一次写入到现在,被修改过的页面数。
    • w S 进程状态。(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
    • x COMMAND 命令名/命令行
    • y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
    • z Flags 任务标志,参考 sched.h

    默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。

    通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z 即可显示或隐藏对应的列,最后按回车键确定。
    按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。

    按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的 R 键可以将当前的排序倒转。

     

     

    cat /proc/meminfo

      /proc/meminfo是了解Linux系统内存使用状况的主要接口,我们最常用的”free”、”vmstat”等命令就是通过它获取数据的。/proc/meminfo所包含的信息比”free”等命令要丰富得多,但也很复杂,感兴趣的话可以看看这篇文章:http://linuxperf.com/?p=142,对 /proc/meminfo 有较详细的解释。

    $ cat /proc/meminfo
    MemTotal:        8047472 kB
    MemFree:          137996 kB
    MemAvailable:    1775804 kB
    Buffers:          384580 kB
    Cached:          1910796 kB
    SwapCached:        11168 kB
    Active:          5993756 kB
    Inactive:        1423988 kB
    Active(anon):    4886780 kB
    Inactive(anon):   834700 kB
    Active(file):    1106976 kB
    Inactive(file):   589288 kB
    Unevictable:          64 kB
    Mlocked:              64 kB
    SwapTotal:       8267772 kB
    SwapFree:        7929596 kB
    Dirty:               124 kB
    Writeback:             0 kB
    AnonPages:       5115296 kB
    Mapped:           440068 kB
    Shmem:            647576 kB
    Slab:             307660 kB
    SReclaimable:     246212 kB
    SUnreclaim:        61448 kB
    KernelStack:       13136 kB
    PageTables:        69000 kB
    NFS_Unstable:          0 kB
    Bounce:                0 kB
    WritebackTmp:          0 kB
    CommitLimit:    12291508 kB
    Committed_AS:   11107976 kB
    VmallocTotal:   34359738367 kB
    VmallocUsed:           0 kB
    VmallocChunk:          0 kB
    HardwareCorrupted:     0 kB
    AnonHugePages:         0 kB
    ShmemHugePages:        0 kB
    ShmemPmdMapped:        0 kB
    CmaTotal:              0 kB
    CmaFree:               0 kB
    HugePages_Total:       0
    HugePages_Free:        0
    HugePages_Rsvd:        0
    HugePages_Surp:        0
    Hugepagesize:       2048 kB
    DirectMap4k:      270940 kB
    DirectMap2M:     7997440 kB
    DirectMap1G:           0 kB
    

     

    ps aux命令

      ps aux 命令可以查看系统中各个进程的运行情况,包括了进程占用的内存,%MEM 列就是各个进程的内存占用百分比。

     ps -aux
    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root         1  0.0  0.0 185460  4692 ?        Ss   Jun15   0:07 /sbin/init splash
    root         2  0.0  0.0      0     0 ?        S    Jun15   0:00 [kthreadd]
    root         4  0.0  0.0      0     0 ?        I<   Jun15   0:00 [kworker/0:0H]
    root         6  0.0  0.0      0     0 ?        I<   Jun15   0:00 [mm_percpu_wq]
    root         7  0.0  0.0      0     0 ?        S    Jun15   0:03 [ksoftirqd/0]
    root         8  0.1  0.0      0     0 ?        I    Jun15   9:41 [rcu_sched]
    root         9  0.0  0.0      0     0 ?        I    Jun15   0:00 [rcu_bh]
    root        10  0.0  0.0      0     0 ?        S    Jun15   0:00 [migration/0]
    root        11  0.0  0.0      0     0 ?        S    Jun15   0:01 [watchdog/0]
    

     

    展开全文
  • 内存泄漏以及jmap命令的用法

    千次阅读 2018-08-04 14:31:17
    查看内存泄漏命令: 命令 作用 jps 查看java进程号 jmp -histo:live 进程号 > 存放路径 将进程打印到文本中 start 路径名 打开文本,查看实例个数 过程如下: 这是用到的代码(也就是我放到...

    查看内存泄漏命令:

    命令作用
    jps查看java进程号
    jmap -histo:live 进程号 > 存放路径将进程打印到文本中
    start 路径名打开文本,查看实例个数

    过程如下:

    这是用到的代码(也就是我放到TestDemo1.java中的代码):

    /**
     * 栈
     */
    class MyStack {
        private V[] elem;
        private int top;
    
        public MyStack() {
            this(10);
        }
    
        public MyStack(int size) {
            this.elem = new V[size];
            this.top = 0;
        }
    
        /**
         * 判空
         * @return
         */
        public boolean isEmpty() {
            return top == 0;
        }
    
        /**
         * 判满
         * @return
         */
        public boolean isFull() {
            return top == elem.length;
        }
    
        /**
         * 入栈
         * @param val
         */
        public void push(V val) {
            if(isFull()) {
                return ;
            }
            this.elem[this.top++] = val;
        }
    
        /**
         * 出栈
         */
        public void pop() {
            if(isEmpty()) {
                return ;
            }
            this.elem[top-1] = null; //这句是重点
            --this.top;
        }
    
        /**
         * 得到栈顶元素
         * @return
         */
        public V getTop() {
            if(isEmpty()) {
                return null;
            }
            return this.elem[this.top-1];
        }
    }
    
    /**
     * 自定义的一个类,一会将他的实例对象入栈
     */
    class V {
    
    }
    
    public class TestDemo1 {
        public static void main(String[] args) throws InterruptedException {
            MyStack stack = new MyStack();
            stack.push(new V());
            stack.push(new V());
            stack.push(new V());
            //这里有3个V的对象
            stack.pop();   //出栈了一个
            System.gc();  //拿gc()去回收它
            Thread.sleep(100000);  //当前线程休眠100s
        }
    }
    
    
    

    我们现将栈类中出栈方法中的 this.elem[top-1] = null;屏蔽掉,然后编译运行:

    shift+鼠标右键,打开一个powershell窗口:
    在这里插入图片描述

    在这里插入图片描述
    这里我主线程只休眠了100s,所以接下来就要快点了:

    还有要记得创建一个文本来接收,我这里用的是jmap.txt,那么编译之后是这样:
    在这里插入图片描述
    打开另一个powershell窗口:
    在这里插入图片描述

    得到的文本如下:
    在这里插入图片描述

    可以看到,我出栈之后拿gc()去回收V的对象,但它还是有3个对象,这是因为我栈指针top下移了,但那个对象的引用还在,所以垃圾回收器并没有回收它,这就是内存泄漏,

    怎么避免它呢,就是我们在不使用一个对象的时候把它置为空,让它没有引用去引用它,那么垃圾回收器就会回收它了,

    现在我们出栈的时候将该对象的引用置为空,也就是放开栈类中出栈方法中的 this.elem[top-1] = null;现在,重新编译一次,运行:

    然后在打开的另一个powershell窗口中再一次输入jmap命令:
    在这里插入图片描述

    这时我们得到的文本如下:
    在这里插入图片描述

    可以看到,实例对象已经只有两个了。

    展开全文
  • 使用android shell命令查看内存使用情况 单位为千字节 KB adb shell dumpsys meminfo pkgname 示例 adb shell dumpsys meminfo top.ftas.demo.leaked # 查看 Java Heap 大小 adb shell dumpsys meminfo top....

    adb 命令

    使用android shell命令查看内存使用情况

    单位为千字节 KB

    adb shell dumpsys meminfo pkgname

    示例

    adb shell dumpsys meminfo top.ftas.demo.leaked
    # 查看 Java Heap 大小
    adb shell dumpsys meminfo top.ftas.demo.leaked|grep Java\ Heap
    # 查看 Native Heap 大小
    adb shell dumpsys meminfo top.ftas.demo.leaked|grep Native\ Heap

    内存动态监控

    watch -n 0.5 adb shell dumpsys meminfo top.ftas.demo.leaked

    一般需要重点关注下面:
    Heap Alloc 列,TOTAL 行(或者 App Summary 的 Java Heap ) - 数值的大小
    Activities - 数值的大小
    Views - 数值的大小
    AppContexts - 数值的大小

    通过快速输出 Activities 的数量,检查出是否有 Activities 泄露

    adb shell dumpsys meminfo 应用包名 |grep Activities

    示例

    adb shell dumpsys meminfo top.ftas.demo.leaked |grep Activities
    AppContexts:       11           Activities:        8
    AppContexts:       12           Activities:        9

    快速获取当前 Activity ,确定泄露位置

    adb shell dumpsys activity activities | sed -En -e '/Running activities/,/Run #0/p'

    在当前进程中抓取当前进程的hprof信息

    adb shell am dumpheap pid或者pkgName file

    获取 pid 命令

    adb shell ps | grep pkgName

    示例

    #获取 pid
    adb shell ps |grep top.ftas.demo.leake
    #生成 hprof
    adb shell am dumpheap 9686 /data/local/tmp/test-leaked-pid.hprof
    #生成 hprof
    adb shell am dumpheap top.ftas.demo.leaked /data/local/tmp/test-leaked-pkg.hprof
    #下载 hprof
    adb pull /data/local/tmp/test-leaked-pkg.hprof
    #hprof 转成 mat 识别的格式
    hprof-conv test-leaked-pkg.hprof test-leaked-pkg.mat.hprof 
    u0_a876   9686  782   1785284 98684 SyS_epoll_ 0000000000 S top.ftas.demo.leaked

    在当前进程使用 Debug.dumpHprofData 获取 hprof 文件

    Debug.dumpHprofData(path);

    android-developer-dumpHprofData

    示例:

    File hprofFile = new File(getExternalCacheDir(), "DumpHprofDataActivity-dumpHprofData.hprof");
    String path = hprofFile.getAbsolutePath();
    Log.e("DumpHprofDataActivity", "hprofFile.getAbsolutePath = " + path);
    try {
        Debug.dumpHprofData(path);
    } catch (IOException e) {
        Log.e("DumpHprofDataActivity", Log.getStackTraceString(e));
    }
    #从缓存中拉取 hprof 文件
    adb pull /storage/emulated/0/Android/data/top.ftas.demo.leaked/cache/DumpHprofDataActivity-dumpHprofData.hprof
    #hprof 文件格式转换
    hprof-conv DumpHprofDataActivity-dumpHprofData.hprof DumpHprofDataActivity-dumpHprofData.mat.hpro

    jhat

    分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言 

    # 生成 hprof
    adb shell am dumpheap top.ftas.demo.leaked /data/local/tmp/test-leaked-pkg.hprof
    # 下载 hprof
    adb pull /data/local/tmp/test-leaked-pkg.hprof
    # 将 HPROF 文件从 Android 格式转换为 Java SE HPROF 格式
    hprof-conv test-leaked-pkg.hprof test-leaked-pkg.mat.hprof 
    # 启动 jhat 服务器,分析 hprof 文件
    # 或 jhat -J-Xmx512m <heap dump file>
    jhat test-leaked-pkg.mat.hprof
    # 访问本地 jhat 站点
    open http://localhost:7000/

    分析内存泄露常见思路

    mat 分析 - Histogram - Activity 泄露

    进入 Histogram
    Class Name 中输入 Activity 进行过滤
    点击 Objects 排序
    重点关注 Objects 字段, 哪些 Activity 过多
    找到 Objects 大于 1 的,一般就有泄露的可能
    右键有泄露可能的 Activity,按如下方式确定泄露路径
    Merge Shortes Paths to GC Roots
    exclude all phantom/weak/soft etc.references
    其中最下方的 Total:7 entries 是总泄露数
    依次展开任意一行,可以看到完整的泄露路径。其中最顶部是 GC Root。 

    mat 分析 - Histogram - Shallow Heap 排序

    一般占比最高的是 byte[] 或者 char[]
    右键 byte 数组
    Merge Shortes Paths to GC Roots
    exclude all phantom/weak/soft etc.references
    按 Ref.Shallow Heap 排序,确认 Ref.Shallow Heap 占用内存较多的对象是否合理 

    Android Studio Profiler - Memory Profiler Activity 内存泄露分析法

    官方文档:memory-profiler

    先捕获堆转储,请点击 Memory Profiler 工具栏中的 Dump Java heap 图标
    Filter 中输入 Activity 回车
    点击 Allocations 按实例数排序
    点击 Allocations 数值较多的 Activity
    右侧 『Instance View』面板中会出现所有实例对象(观察 Depth,比如为 5),点击任意一个实例对象
    右下侧『References』两板中会出现引用链
    依次展开『References』,找到泄露源。特别注意,由于有循环引用,这里一定要按照 Depth 『5 4 3 2 1 0』的顺序展开。否则会无限循环,无穷尽也。 

     

    CPU Profiler

    官方文档:cpu-profiler

     

    展开全文
  • Linux下实用的JAVA内存泄露监控命令

    千次阅读 2015-09-14 18:23:17
    内存泄露一直是比较头疼的事情,下面三个命令我个人觉得相当有用。 1、jstack (linux下特有) 可以观察到jvm中当前所有线程的运行情况和线程当前状态 jstack 2083 输出内容如下: 2、...
  • 一、内存溢出、内存泄露 1、内存溢出 程序在申请内存时,没有足够的内存空间 栈溢出 虚拟机栈(线程独享的栈空间)StackOverflowError 栈溢出:不断创建线程,使得栈空间被打满,OutOfMemoryError 堆溢出 不断的...
  • 程序内存泄露监视 因此,您的应用程序内存不足,您日夜不停地分析应用程序,以期捕获对象中的内存漏洞。 后续步骤将说明如何监视和检测您的内存泄漏,以确保您的应用程序处于安全状态。 1.怀疑内存泄漏 如果您...
  • 综述内存泄漏(memory leak)是指由于疏忽或错误造成程序未能释放已经不再使用的内存。那么在Android中,当一个对象持有Activity的引用,如果该对象不能被系统回收,那么当这个Activity不再使用时,这个Activity也不会...
  • 今天在部署实验室项目时,发现项目在后台运行一个晚上后内存增长了近3g。考虑到目前的数据量较小,真正...在分析内存泄露之前需要先了什么情况会导致内存泄露.具体内容可以参照如下几篇博客:检测内存泄露接下来检测...
  • *这篇来学习一下Linux中的一个命令——mtrace,它是怎么用的呢?一起来看看。。。→_→*
  • 执行下面的代码会导致内存泄漏,实在不知道为啥了,求助 if(SystemUtils.IS_OS_LINUX){ Process process = Runtime.getRuntime().exec(cmd); InputStream is = process.getInputStream(); ...
  • jmap命令问题解决与内存泄漏

    千次阅读 2019-02-19 22:18:20
     jmap 命令查看内存中对象的数量,统计内存泄漏。  命令为:jps ==》 jmap -histo:live 进程号 &amp;gt; 1.txt (内存中对象的数量统计写入1.txt文件中);使用jmap -histo[:live] pid查看堆内存中的对象数目、...
  • 通过top命令监控进程活动,保存日志 # -d 1表示top命令频率为 每隔0.5秒;-n 1 表示刷新1次后退出 # 循环每隔0.5秒执行一次 # col命令过滤输出内容保存到日志时产生的控制字符(乱码问题) while true; do top -d ...
  • 1.简介基本命令功能 1、jps:查看本机java进程信息。 2、jstack:打印线程的栈信息,制作线程dump文件。 3、jmap:打印内存映射,制作堆dump文件 ...2.排查jvm内存泄漏过程 (1)查找要排查程序的进程ID 使用jp...
  • 关于内存泄漏

    千次阅读 2016-10-13 16:19:52
    概念 造成影响 内存是如何分配的 内存泄漏产生原因 ...使用新版Android Studio检测内存泄露和性能 我们怎么检测内存泄露呢 追踪内存分配 查询方法执行的时间 我们如何判断可能有问题的方法 Android内存分析命令
  • 不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露。 其实如果我们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造成...
  • jdk安装后会自带一些小工具,jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java进程(或核心文件、远程调试服务器)的...jmap命令可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏...
  • 利用linux的mtrace命令定位内存泄露 Memory Leak
  • 内存监控命令

    2020-03-14 18:42:23
    一:内存大小查看 1、free -m (m为单位,MB)【静态查看】 total #总内存 used #已经使用了的 free #空闲的 shared #共享 buffers #缓冲区 cached #缓存区 -/+buffers/cach...
  • JAVA内存泄漏

    2021-08-02 23:11:02
    JAVA后端开发知识总结(持续更新…) JAVA内存泄漏 文章目录JAVA内存泄漏一、内存溢出二、内存泄漏2.1 定位与解决 一、内存溢出 ...  内存泄露,是指程序在申请内存并且用完这块内存后(对象不再需要.
  • linux释放内存命令

    万次阅读 2019-04-13 02:00:38
    Linux释放内存命令:sync echo 1 > /proc/sys/vm/drop_caches drop_caches的值可以是0-3之间的数字,代表不同的含义:0:不释放(系统默认值)1:释放页缓存2:释放dentries和inodes 3:释放所有缓存释放完内存...
  • Java内存泄露问题定位常用命令

    千次阅读 2017-12-26 08:39:45
    http://ip:7000 页面直接拉到最下面,可以看出实例引用个数排行,哪里内存泄露。 lsof -p 26674 ls -al /proc/pid/fd 存在大批量的打开anon_inode:[eventpoll]和pipe,如果超过100个eventpoll, 通常情况下是开启了...
  • 内存泄露

    2016-12-08 15:52:03
    解决内存泄漏
  • 观察运行中的jvm物理内存的占用情况。 参数如下: -heap :打印jvm heap的情况 -histo: 打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。 -histo:live : 同上,但是只答应存活对象...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,776
精华内容 32,310
关键字:

内存泄露的命令