日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单例模式引发的内存泄漏:_资源泄漏:救援的命令模式

發(fā)布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单例模式引发的内存泄漏:_资源泄漏:救援的命令模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

單例模式引發(fā)的內(nèi)存泄漏:

多年來, 使用Plumbr進行性能監(jiān)控時,我遇到了數(shù)百個資源泄漏引起的性能問題。 在這篇文章中,我想描述一種最簡單的方法來清理資源并避免該問題。

首先,我以電影播放器??應(yīng)用程序為例來描述問題。 這種應(yīng)用程序的主要功能自然是在播放電影本身。 按照當今的習慣,我們不想將整個電影收藏存儲在用于播放電影的設(shè)備上。 相反,我們將電影下載到本地臨時文件中,然后播放并刪除該文件以釋放下一個電影的空間。 這種工作流程的幼稚實現(xiàn)如下所示:

public class MoviePlayer {private final Catalog catalog = new Catalog();public void play(String movieName, String screen) {Movie movie = catalog.find(movieName);try {movie.fetch();movie.play(screen);} finally {movie.release();}} }class Catalog {Movie find(String name) {return new Movie(name);} }

如您所見, MoviePlayer類是Catalog類的客戶端,必須照顧電影播放的整個生命周期。 查找,下載,播放和刪除文件均屬于MoviePlayer類的實現(xiàn)。

這是第一個問題:如果至少一個這樣的客戶端是由一些粗心的開發(fā)人員編寫的,他們忘記調(diào)用movie.release()方法,那么下載的文件將保留在本地磁盤上。 因此,您播放的每部電影都將添加一個文件,并且設(shè)備上的磁盤空間最終將被耗盡。

引入其他功能后,就會暴露出這種“萬事通”代碼的第二個問題。 例如,假設(shè)您需要增加記錄實際電影播放時間的可能性。

當前唯一的方法是更改MoviePlayer類。 如果Catalog類有其他客戶,則每個客戶都需要引入更改。 結(jié)果, MoviePlayer的每個附加功能都變得越來越大,處理越來越多的獨立問題。 結(jié)果,代碼最終將難以理解和更改。

考慮到MoviePlayer應(yīng)該主要只是處理電影的播放,所以聽起來確實有太多麻煩。 的確,讓我們嘗試將所有這些混亂的內(nèi)容從MoviePlayer中移出,以確保我們擁有一個負責任的班級。 擁有20年歷史的命令設(shè)計模式最適合手頭的任務(wù)。

減輕痛苦:救援的命令模式


該方法背后的基本思想是首先抽象出因使用案例而異的操作,以使其與算法中更穩(wěn)定的部分區(qū)分開。 在我們的情況下,這可能涉及電影播放或使用不同的視頻編解碼器進行重新編碼。 因此,包括“查找電影下載-執(zhí)行某些操作-刪除本地文件”的無聊步驟的樣板將與特定用例隔離。 在我們的示例中,我們可以使用以下簡單的界面進行操作:

interface MovieCommand {void execute(Movie movie); }

上面的更改包括引入一種帶有MovieAction類型的附加參數(shù)的新方法。 在此方法中,將執(zhí)行整個算法:

  • 電影已找到。
  • 電影已下載。
  • 傳遞給該方法的動作或命令在影片上執(zhí)行。 現(xiàn)在,特定操作是隨用例而變化的唯一可變部分。
  • 最后,釋放電影的文件句柄并執(zhí)行對臨時文件的清理。

現(xiàn)在,如果需要以任何方式更改算法,我們將只在一個地方進行操作,而不會影響仍僅關(guān)注其特定動作(例如電影播放或編碼)的任何客戶端。 我們的MoviePlayer示例現(xiàn)在很簡單:

class Catalog {private Movie find(String name) {return new Movie(name);}void withMovie(String movieName, MovieCommand action) {Movie movie = find(movieName);try {movie.fetch();action.execute(movie);} finally {movie.release();}} }

該技術(shù)非常強大且廣泛。 如果您尚未意識到此用途,請考慮對關(guān)系數(shù)據(jù)庫的JDBC訪問。 所有與獲取數(shù)據(jù)庫連接,準備語句,獲取結(jié)果集以及關(guān)閉資源有關(guān)的樣板文件,特別是在Spring Templating進行救援之前,都是噩夢般的處理順序。

同樣,可以通過使用命令模式,從不必要的樣板中清除代碼并大大簡化代碼庫,在自定義代碼庫中實現(xiàn)不同方面,例如安全檢查或緩存。

翻譯自: https://www.javacodegeeks.com/2016/09/resource-leakages-command-pattern-rescue.html

單例模式引發(fā)的內(nèi)存泄漏:

總結(jié)

以上是生活随笔為你收集整理的单例模式引发的内存泄漏:_资源泄漏:救援的命令模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。