单例模式引发的内存泄漏:

多年来, 使用Plumbr进行性能监控时,我遇到了数百个资源泄漏引起的性能问题。 在这篇文章中,我想描述一种最简单的方法来清理资源并避免该问题。

首先,我以电影播放器​​应用程序为例来描述问题。 这种应用程序的主要功能自然是在播放电影本身。 按照当今的习惯,我们不想将整个电影收藏存储在用于播放电影的设备上。 相反,我们将电影下载到本地临时文件中,然后播放并删除该文件以释放下一个电影的空间。 这种工作流程的幼稚实现如下所示:

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类的实现。

这是第一个问题:如果至少一个这样的客户端是由一些粗心的开发人员编写的,他们忘记调用movie.release()方法,那么下载的文件将保留在本地磁盘上。 因此,您播放的每部电影都将添加一个文件,并且设备上的磁盘空间最终将被耗尽。

引入其他功能后,就会暴露出这种“万事通”代码的第二个问题。 例如,假设您需要增加记录实际电影播放时间的可能性。

当前唯一的方法是更改MoviePlayer类。 如果Catalog类有其他客户,则每个客户都需要引入更改。 结果, MoviePlayer的每个附加功能都变得越来越大,处理越来越多的独立问题。 结果,代码最终将难以理解和更改。

考虑到MoviePlayer应该主要只是处理电影的播放,所以听起来确实有太多麻烦。 的确,让我们尝试将所有这些混乱的内容从MoviePlayer中移出,以确保我们拥有一个负责任的班级。 拥有20年历史的命令设计模式最适合手头的任务。

减轻痛苦:救援的命令模式


该方法背后的基本思想是首先抽象出因使用案例而异的操作,以使其与算法中更稳定的部分区分开。 在我们的情况下,这可能涉及电影播放或使用不同的视频编解码器进行重新编码。 因此,包括“查找电影下载-执行某些操作-删除本地文件”的无聊步骤的样板将与特定用例隔离。 在我们的示例中,我们可以使用以下简单的界面进行操作:

interface MovieCommand {void execute(Movie movie);
}

上面的更改包括引入一种带有MovieAction类型的附加参数的新方法。 在此方法中,将执行整个算法:

  • 电影已找到。
  • 电影已下载。
  • 传递给该方法的动作或命令在影片上执行。 现在,特定操作是随用例而变化的唯一可变部分。
  • 最后,释放电影的文件句柄并执行对临时文件的清理。

现在,如果需要以任何方式更改算法,我们将只在一个地方进行操作,而不会影响仍仅关注其特定动作(例如电影播放或编码)的任何客户端。 我们的MoviePlayer示例现在很简单:

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();}}
}

该技术非常强大且广泛。 如果您尚未意识到此用途,请考虑对关系数据库的JDBC访问。 所有与获取数据库连接,准备语句,获取结果集以及关闭资源有关的样板文件,特别是在Spring Templating进行救援之前,都是噩梦般的处理顺序。

同样,可以通过使用命令模式,从不必要的样板中清除代码并大大简化代码库,在自定义代码库中实现不同方面,例如安全检查或缓存。

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

单例模式引发的内存泄漏:

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

  1. windows 内存泄露和资源泄漏调试

    AQTime (有x64.win32的)进行内存泄露和资源泄漏监控 http://wenku.baidu.com/view/9aa1c2afdd3383c4bb4cd2c1.html x64下载:ht ...

  2. 资源泄漏:救援的命令模式

    多年来, 使用Plumbr进行性能监视时,我遇到了数百个资源泄漏引起的性能问题. 在这篇文章中,我想描述一种最简单的方法来清理资源并避免该问题. 首先,我以电影播放器​​应用程序为例来描述问题. 这种 ...

  3. sun服务器清理内存日志_服务器清理日志的命令行

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  4. 多线程内存泄漏_内存泄漏的场景和解决办法

    1.非静态内部类会持有外部类的引用,如果非静态内部类的实例是静态的,就会长期的维持着外部类的引用,组织被系统回收,解决办法是使用静态内部类 2.多线程相关的匿名内部类和非静态内部类 匿名内部类同样会持 ...

  5. wince 内存释放_【转载】让我生不如死的WINCE内存泄漏

    转自天极网,URL=http://dev.yesky.com/346/8269346.shtml 很多实时嵌入式设备是长时间不间断运行的,即使是少许的内存泄漏,也会积少成多,对嵌入式系统带来灾难性的影 ...

  6. PerfView专题 (第十篇):洞察 C# 终结队列引发的内存泄漏

    一:背景 C# 程序内存泄漏的诱发因素有很多,但从顶层原理上来说,就是该销毁的 用户根 对象没有被销毁,从而导致内存中意料之外的对象无限堆积,导致内存暴涨,最终崩溃,这其中的一个用户根就是 终结器队列 ...

  7. Java中由substring方法引发的内存泄漏

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 在Java中我们无须关心内存的释放,J ...

  8. jni jvm 内存泄漏_解析Java的JNI编程中的对象引用与内存泄漏问题

    JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互--在 Java 程序中调用 native ...

  9. unity如何检测内存泄漏_如何排查Java内存泄漏?看懂这一篇就够用了

    原文:https://www.toptal.com/java/hunting-memory-leaks-in-java 作者:Jose Ferreirade Souza Filho 译者:Emma来源 ...

最新文章

  1. ReentrantReadWriteLock
  2. 基于动态用户偏好和服务质量的推荐算法
  3. MongoDB自动删除过期数据--TTL索引
  4. flex 关键词过滤 2.5.35
  5. 从扁平到立体:Windows 10 图标的演化
  6. 话里话外:成功实施ERP要做到的几个关注点
  7. MFC中的文件读写技术
  8. 【perl】Connect to a MySQL using the Perl DBI module
  9. linux 移动硬盘 优化,不花一分钱,给移动硬盘加速
  10. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第2节 Stream流式思想概述_2_使用Stream流的方式,遍历集合...
  11. win10壁纸不能幻灯片放映_如何设置Win10桌面壁纸幻灯片放映? 设置Win10桌面壁纸幻灯片放映的方法...
  12. 阿里巴巴矢量图标批量下载
  13. 反击网络执法官(转)
  14. 【ERP】概念_总账系统、记账、往来科目
  15. 通过Java创建Socket 连接到服务器
  16. Google Earth Engine(GEE)——美国近地表高精度实时气象数据集(2500米分辨率)
  17. Spring 框架之九阴真经
  18. 微信在线EXCEL自动统计人数
  19. 方阵循环右移c语言,C语言第二次实验报告 - osc_zfz30hgc的个人空间 - OSCHINA - 中文开源技术交流社区...
  20. 50种黑白人像摄影调色效果lr预设

热门文章

  1. APIO游记(5.19-5.23)
  2. AT2064-[AGC005F]Many Easy Problems【NTT】
  3. P2231-[HNOI2002]跳蚤【容斥】
  4. jzoj3084-超级变变变【数学】
  5. nssl1217-So many prefix?【KMP】
  6. GYM 101669F - Binary Transformations
  7. P2053 SCOI2007 修车,费用流好题
  8. 11、mysql数据表中数据的查询(3)
  9. 汇编语言(二十九)之数值的二进制和十进制
  10. 服务降级的概念及应用手段