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

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

多年来, 使用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年历史的命令设计模式最适合手头的任务。

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ant构建项目迁移到gradle_Gradle这么弱还跑来面腾讯?

点击上方“刘望舒”,选择“星标”多点在看,就是真爱作者: 厘米姑娘(腾讯开发妹子)| 来源 :公号 码个蛋https://www.jianshu.com/p/1274c1f1b6a4前言在使用Android Studio过程中没少被Gradle坑过,虽然网上有很多简单粗暴的解决方案…

java heroku_使用Spring Boot和Heroku在20分钟内完成Java的单点登录

java heroku建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现。 注册 ,再也不会建立auth了! 大规模更新 我最初为本文…

如何使用SSH客户端远程操作linux系统,并启动、关闭tomcat和查看后台日志

cd … 表示回退到上一级目录 ls 表示查看当前目录下的所有文件 我们的tomcat安装路径在usr\local\yzmis\下面找 例如你要关闭信誉质量考核系统所在的tomcat,你要进入test下去找到apache-tomcat-6.0.14 再进入bin目录下,然后执行[trserver100 bin]$ ./sh…

模块pdf2image.dll加载失败_Webpack 原理从前端模块化开始

当前主流 JS 模块化方案无模块化CommonJS 规范,nodejs 实现的规范AMD 规范,requirejs 实现的规范CMD 规范,seajs 实现的规范, seajs 与 requirejs 实现原理有很多相似的地方 u ES Modules,当前 js 标准模块化方案注意:…

ios html正则表达式,ios 正则表达式去html标签

ios 正则表达式去html标签[2021-01-27 12:53:55] 简介:php正则表达式去掉html的方法:首先使用“htmlspecialchars_decode” 将特殊的HTML实体转换回普通字符;然后通过正则表达式“preg_replace(/]>/,,$_st系统运维正则表达式概述基础正则表达式扩展正…

java开发五年面试经验_只有经验丰富的开发人员才能教您有关Java的5件事

java开发五年面试经验深入研究Java之前需要了解的所有内容的概述 有许多工具,方法,环境和功能会改变您处理代码的方式,而这些通常是在学年期间不会遇到的。 虽然它在Java开发世界中迈出了第一步,但大多数实际学习都是在工作中进行…

c++调用cplex求解例子_视频教程 | 用Python玩转运筹优化求解器IBM CPLEX(二)

编者按优化求解器对于做运筹学应用的学生来说,意义重大。然而直到今天,放眼望去,全网(包括墙外)几乎没有一个系统的Cplex中文求解器教程。作为华人运筹学的最大的社区,『运筹OR帷幄』 责无旁贷,…

markdown 行内公式_如何轻松将笔记转为思维导图(Word、Markdown)

目录简介Markdown -> XMindWord -> XMind简介思维导图是一种一种图像式思维的工具,便于我们理解知识之间的逻辑关系。在我们的学习、生活中,我们习惯于使用word、markdown等笔记软件,而较少的使用思维导图。其实,有些时候我…

apache.camel_Apache Camel 2.18发布–包含内容

apache.camel本周发布了Apache Camel 2.18.0 。 此版本是重要版本,我将在此博客文章中重点介绍。 Java 8 Camel 2.18是第一个需要Java 1.8的版本(例如,容易记住的Camel 2.18 Java1.8。Camel2.17 Java 1.7)。 我们采取了谨慎的…

cors跨域_Spring Boot 中通过 CORS 解决跨域问题

(给ImportNew加星标,提高Java技能)转自:江南一点雨今天和小伙伴们来聊一聊通过CORS解决跨域问题。同源策略很多人对跨域有一种误解,以为这是前端的事,和后端没关系,其实不是这样的,说到跨域,就不…

逻辑建模与物理建模_架构层和建模域逻辑

逻辑建模与物理建模在讨论用于建模域逻辑(例如事务脚本,表模块,域模型)的PoEAA模式时,我注意到人们对域模型模式是最好的印象(尽管印象不对)。 因此,他们开始将其应用于所有内容。 …

html文字列表,文字列表模板

文字列表模板1、如何编辑列表模板文字列表模板存放在模板包archive文件夹中,命名以list_text为前缀在模板包中找到list_text.html 模板,复制另存为一个新模板,命名为list_text_自定义名称.html自定义名称可以是英文或拼音,但不能用…

inputstreamreader未关闭会导致oom_Linux内核OOM机制分析和防止进程被OOM杀死的方法...

问题描述Linux 内核有个机制叫 OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。典型的情况是:某天一台机器突然 ssh 远程登录不了&…

centos一键清理磁盘空间_如何清理 Docker 占用的磁盘空间

Docker 很占用空间,每当我们运行容器、拉取镜像、部署应用、构建自己的镜像时,我们的磁盘空间会被大量占用。如果你也被这个问题所困扰,咱们就一起看一下 Docker 是如何使用磁盘空间的,以及如何回收。docker 占用的空间可以通过下…

mongodb dsl_具有Java DSL的Spring Integration MongoDB适配器

mongodb dsl1引言 这篇文章解释了如何使用Spring Integration从MongoDB数据库中保存和检索实体。 为了完成此任务,我们将使用Java DSL配置扩展来配置入站和出站MongoDB通道适配器。 例如,我们将构建一个应用程序,使您可以将订单写入MongoDB存…

Oracle 数据库中较为复杂或典型的 SQL 语句的解读

文章目录批量生成 SQL 语句/拼接字符串多表关联查询 where 子句示例(一)示例(二)普通的表间内连接查询语句关键字 distinct 用法说明Oracle 数据库的分组排序查询Oracle 数据库 cast 函数Oracle 数据库 sum 函数的高级用法Oracle…

私有方法与静态私有方法_每个私有静态方法都是新类的候选人

私有方法与静态私有方法您是否有私有的静态方法来帮助您将算法分解为更小的部分? 我做。 每当我编写一个新方法时,我就会意识到它可以是一个新类。 当然,我不会从所有课程中选修课程,但这必须是目标。 私有静态方法不可重用&#…

c语言插入排序_还有这种操作?C语言插入排序算法,一点就透

插入排序算法是所有排序方法中最简单的一种算法,其主要的实现思想是将数据按照一定的顺序一个一个的插入到有序的表中,最终得到的序列就是已经排序好的数据。更多C/C资料群文件:569268376直接插入排序是插入排序算法中的一种,采用…

Mac 如何操控远程的 Windows 电脑

文章目录使用 Remote Desktop Connection for mac 客户端第 1 步:Windows 电脑进行远程设置第 2 步:Windows 电脑设置管理员账号和密码第 3 步:获取 Windows 电脑的 IP 地址第 4 步:Mac 电脑安装远程桌面连接客户端第 5 步&#x…

map iterator_一个简单的Map Iterator性能测试

map iteratorJava Map性能有很多方面可以衡量,但是关键的一个是简单的单线程扫描。 这是一些针对Iterators和Java 8 Map.forEach()简单测试代码,以及一些图形结果。 1.性能测试困难 性能测试是一项非常困难的工作,精确的可重复性测试需要Jav…