核心保留記憶體防止洩漏的機制 轉

2022-06-21 08:30:11 字數 2130 閱讀 1013

**:

保留記憶體防止洩漏的機制:程序退出會呼叫

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...