RSS icon Home
  • android memory leak

    2011-10-24 11:59:00 Watermelon

    本文是http://developer.android.com/resources/articles/avoiding-memory-leaks.html的笔记。

    Java 也有memory leak? 首先陈清一下Java / C-like 语言中的memory leak的不同含义。

    C-like 语言中的memory leak指的是 一片动态分配的内存,在程序空间中已经没有任何一个指针变量指向这片内存了。因为C是没有内存管理的,于是这片内存再也没有谁知道,也不会被释放了。

    Java中这里说的memory leak是另外一个意思,我们知道Java中的内存使用GC 回收,若一片内存没有reference就会定期被GC回收。那么如果一片内存(或者,对于JAVA来说一个对象)一直有变量引用,那么这片内存当然就不会被回收掉。

    而Android 程序一个明显特点是所有的activity, service, ...都有一个context,这是用于给android系统判断类的归属的,从而根据程序配置来分配各种permission和各种资源。但这个context若使用不当会带来memory leak。

    private static Drawable sBackground;
     
    @Override
    protected void onCreate(Bundle state) {
     
    super.onCreate(state);
     
     
    TextView label = new TextView(this);
      label
    .setText("Leaks are bad");
     
     
    if (sBackground == null) {
        sBackground
    = getDrawable(R.drawable.large_bitmap);
     
    }
      label
    .setBackgroundDrawable(sBackground);
     
      setContentView
    (label);
    }

     

    当onCreate()后,程序的对象引用情况是:

    sBackground ---> label ---> context ---> many other things

    android的view的结构使得sBackground这个对象中有内部成员指向它的label,以及context。而context指向了这个activity。 由于sBackground是一个静态的变量,除非sBackground被赋值为null,否则上面这个链条都不会被释放内存。这就有是所谓的memory leak了。

     

    如何避免?

    - 小心使用static,引用activity的对象,应该使用和activity相同的生存期。

    - 可以使用this.getApplicationContext()来引用整个应用程序的context

  • http协议相关

    2011-10-18 20:58:00 Watermelon

    对于http这里整理一些底层的结果。

    http的请求看似有很多头或者结构等等,其实全都是使用\r\n这些来分割的。使用抓包工具就可以清楚看到。

    session

    http本来是没有会话的概念的,因此引入了一个session的header在http请求或者答复的header上,当 http server decide to start a session, in the http request response header, there is a field

    Set-Cookie: PHPSESSID=324234231; path=/\r\n

    Then browser should remember this cookie and in the subsequent requests, a new header can be set to indicate server that which session we belongs to. The header looks like,

    Cookie: PHPSESSID=324234231\r\n

     

     

     

  • virtualBox usage

    2011-09-07 14:07:00 Watermelon

    virtualBox 是很好的虚拟化工具,并且是免费开源的哦。

     

    主要的功能:

    1. snapshot, 记录一个状态,可以回到此状态,便于一些系统级的调试

    2. 机器迁移,只要复制vdi,vbox文件。在新机器上新建机器,并将硬盘连上就可以了。

     

    好玩的:

    seamless mode,虚拟机在seamless模式下不显示桌面了,可以和正常的窗口混合在一起。

     

    牛逼的:

    teleporting,意思是可以将虚拟机在不关机的情况下从一个host传送到另一个host去,host只要是有virtualbox的就可以,不管操作系统。之间使用tcp网络连接传送。前提是虚拟机的硬盘使用的是NFS或其他的网络存储。这对于大系统很有用。

     

     

  • useful shell cmd

    2011-08-21 12:50:00 Watermelon

    Some useful linux shell commands will be summerized here.

    - list one filename or directory name per line

    ls -1

     

    - get size of subdirectories containing the size of their subdirectories and files. But not list subdirectories of subdirectories recursively. (this is useful to do disk space cleanning)

    du -d1 -h

     

     

  • i2c 调试经验

    2011-06-06 13:00:00 Watermelon

    i2c总线的是很折腾的一个东西,基本上我用过3,4回,每次都会调试一会儿才能通上。呵呵。。所以想想写一个简洁明了的checklist,方便以后。

     

    • 注意i2c的一个重要基本概念是,除了发送start, stop,别的在SCL为高时,data都不能改变。(因为一旦改变,就成为了一个start 或者 stop 的信号了)。
    • 另外要特别注意发送数据时,为了满足clock setup, hold的要求,在发送数据时也不要讲SCL, SDA同时改变,而是在SCL改变后,等待一些延时,再发送SDA。
    • 各种datasheet上的写法不一致,有的i2c的地址使用8-bit表示的,一个设备有两个地址,一读一写。比如一个地址是0x81为读, 0x80为写。
      还有的设备写法是使用7-bit地址,加上一位write or read. 比如上面的这个地址,也可以写成7为的0x40,加上一个0或1的读写bit。
    • 最好使用示波器调试,那样会少花很多时间,不要妄想我可以一下调成,懒得用示波器呵呵