怎样制作自己的网站,ppt免费网站,创建网站宝典,帮助网站源码单例模式引发的内存泄漏:多年来#xff0c; 使用Plumbr进行性能监控时#xff0c;我遇到了数百个资源泄漏引起的性能问题。 在这篇文章中#xff0c;我想描述一种最简单的方法来清理资源并避免该问题。 首先#xff0c;我以电影播放器应用程序为例来描述问题。 这种应… 单例模式引发的内存泄漏: 多年来 使用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单例模式引发的内存泄漏: