美文网首页
记录一次内存危险操作

记录一次内存危险操作

作者: ftc300_carl | 来源:发表于2017-09-05 16:50 被阅读0次

本文属于装糊涂的猪原创,转载请注明出处作者

背景

自定义时钟的时候,无意间在onDraw方法中创建对象,然后就引发了内存的肆意增长,伪代码为

   @Override
    protected void onDraw(Canvas canvas) {
        method();
        invalidate();
    }

    private void method() {
        Calendar calendar = Calendar.getInstance();
        ...
    }

学习与成长

如何发现的呢?多亏了AndroidStudio的强大功能Android Monitor。为了更好的研究AS的这个集成功能新建了一个自定义view。

public class CurrentTv extends TextView {
    public CurrentTv(Context context) {
        this(context, null);
    }
    public CurrentTv(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    SimpleDateFormat sdf = new SimpleDateFormat( "HH:mm", Locale.getDefault());

    public CurrentTv(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
             setText(getCurrentText());
        }
    };

    public void onStart(){
        handler.removeCallbacks(renderRunnable);
        handler.post(renderRunnable);
    }

    public void onStop(){
        handler.removeCallbacks(renderRunnable);
    }


    Runnable renderRunnable = new Runnable() {
        @Override
        public void run() {
            handler.postDelayed(renderRunnable,1000);
        }
    };

    private String getCurrentText() {
        Date curDate = new Date();
        return sdf.format(curDate);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        setText(getCurrentText());
    }

    @Override
    public void invalidate() {
        if (hasWindowFocus()) {
            super.invalidate();
        }
    }


    @Override
    public void onWindowFocusChanged(boolean hasWindowFocus) {
        super.onWindowFocusChanged(hasWindowFocus);
        if (hasWindowFocus) {
            invalidate();
        }
    }
}

很简单的自定义view,功能是即时在Textview上显示当前时间,但是在onDraw中创建的对象Date。于是乎,在下面的gif中粗浅的分析了一波。首先看到的是


image.png

Allocated不断地增长,此时点击


image.png
开始追踪,几秒后,再次点击 image.png

停止追踪,稍等片刻就会生成报告。

image.png

同时你可以在左侧Captures中查看历史报告

image.png

整个操作流程如下:


memory.gif

参考链接:
Allocation Tracker

相关文章

  • 记录一次内存危险操作

    本文属于装糊涂的猪原创,转载请注明出处作者 背景 在自定义时钟的时候,无意间在onDraw方法中创建对象,然后就引...

  • iOS笔记-记录一次内存泄漏发现过程

    iOS笔记-记录一次内存泄漏发现过程 iOS笔记-记录一次内存泄漏发现过程

  • Java基础

    Java和C++的区别?a. Java没有指针。c++可以通过指针直接操作内存,但这个动作是危险的,指针引起的操作...

  • Zookeeper总篇 高性能 一致性原理

    概述 zookeeper的内存模型: zk的数据存在内存当中(高性能),但是同时记录操作日志+内存快照(二进制),...

  • 危险操作

    今天又是打车遇到可爱司机的一天。但是他这个操作太危险了。。。 这个司机不怎么会说英语,然后再加上我的英语水平和印尼...

  • 【操作系统笔记】操作系统内存管理和jvm内存管理的对比和关系

    在上一次的文章 【操作系统基础知识】内存管理 里学习了操作系统的内存管理的基础知识,今天做个延伸拓展,来学习从操作...

  • go 的 panic 实现原理

    Go 语言开发的程序遇到错误,比较常见的做法是返回 error 给调用者,但对于危险的操作,比如内存越界,则会显示...

  • 【mongoDB】mongoDB journal日志

    运行MongoDB如果开启了journaling日志功能,MongoDB先在内存保存写操作,并记录journali...

  • 5、Java xml操作和解析

    DOM:将标记语言一次性加载到内存,在内存里面形成一颗DOM树优点:操作简单,可以对文档进行CRUD所有操作缺点:...

  • linux core dump

    core dump:(内存快照)在linux中当程序发生异常中止或者崩溃时,操作系统会将程序当时的内存状况记录下来...

网友评论

      本文标题:记录一次内存危险操作

      本文链接:https://www.haomeiwen.com/subject/peoujxtx.html