**:
保留記憶體防止洩漏的機制:程序退出會呼叫
do_exit->exit_files->put_files_struct->close_files->filp_close->fput->__fput
在__fput裡呼叫file->f_op->release(inode,
file)
而在保留記憶體對應release函式中,根據tgid做出判斷,如果有對應tgid的保留記憶體塊沒有被主動釋放,則認為是程序非正常退出,測試釋放與tgid對應保留記憶體塊。
但在android中除錯發現,binder有時會在binder_deferred_func函式中呼叫put_files_struct來釋放某個程序所屬的檔案資源,此時由於tgid屬於binder所在workqueue所在的thread,保留記憶體檢測不到該tgid,即使原來的程序有申請保留記憶體也不會被釋放,從而出現洩漏。
核心中binder在binder_init中建立了乙個workqueue
binder_deferred_workqueue
= create_singlethread_workqueue("binder");
void put_files_struct(struct files_struct *files)
}static
void close_files(struct files_struct * files)
}i++;
set >>= 1;}}
}int
filp_close(struct file *filp, fl_owner_t id)
if(filp->f_op && filp->f_op->flush)
retval = filp->f_op->flush(filp, id);
dnotify_flush(filp,
id);
locks_remove_posix(filp, id);
fput(filp);
return retval;
}void
fput(struct file *file)
static
void __fput(struct file *file)
if (file->f_op && file->f_op->release)
file->f_op->release(inode, file);
security_file_free(file);
ima_file_free(file);
if (unlikely(s_ischr(inode->i_mode) && inode->i_cdev !=
null))
cdev_put(inode->i_cdev);
fops_put(file->f_op);
put_pid(file->f_owner.pid);
file_kill(file);
if (file->f_mode & fmode_write)
drop_file_write_access(file);
file->f_path.dentry = null;
file->f_path.mnt = null;
file_free(file);
dput(dentry);
mntput(mnt);
}static void binder_deferred_func(struct work_struct *work)
else
mutex_unlock(&binder_deferred_lock);
files
= null;
if (defer & binder_deferred_put_files)
if(defer & binder_deferred_flush)
binder_deferred_flush(proc);
if(defer & binder_deferred_release)
binder_deferred_release(proc); /* frees proc */
mutex_unlock(&binder_lock);
if (files)
put_files_struct(files);
} while (proc);
}
防止handler記憶體洩漏
記憶體洩漏 程式執行會用到記憶體,在退出程式的時候,占用記憶體的資料沒有釋放,那麼當資料越來越多的時候,就會產生記憶體洩漏。handler為什麼會記憶體洩漏呢,handler是個內部類,內部類會持有外部類的引用,內部類需要依賴外部類。handler需要定義為靜態類,當你推出activity,hand...
try finally 妙用,防止記憶體洩漏
function createbutton obj.nm use ver function return obj 這裡由於需要返回建立的物件,所以不能把obj直接設為null.return 後obj是區域性變數,不能在外部斷開其與htmlelement的引用.ie中將出現問題洩漏問題 按鈕.做某些事...
怎麼有效的防止記憶體洩漏
1.盡量不去手動分配記憶體。比如,我一般不使用陣列,而使用stl的vector.2.如果需要手動分配陣列,盡量使用stl中的分配方式,或者使用stl和boost中的智慧型指標。2.對於c和c 這種沒有garbage collection 的語言來講,我們主要關注兩種型別的記憶體洩漏 堆記憶體洩漏 h...