造成内存泄漏_如何造成内存泄漏

造成内存泄漏

这将是一个相当邪恶的职位-当您确实希望使某人的生活陷入困境时,您将在谷歌上搜索。 在Java开发领域,内存泄漏只是您在这种情况下会引入的错误类型。 为您的受害者保证几天甚至几周的办公室不眠之夜。

我们将在这篇文章中描述两次泄漏。 两者都很容易理解和复制。 泄漏源于现实世界中的案例研究,但为清楚起见,我们提取了演示案例,以使您更短,更容易掌握。 但是请放心–在我们已经看到并修复了数百个泄漏之后–与演示的情况类似的情况比您预期的更常见。

第一个闯入环的参赛者–臭名昭著的HashSet / HashMap解决方案,其中使用的键不具有或具有不正确的equals()/ hashCode( )解决方案。

class KeylessEntry {static class Key {Integer id;Key(Integer id) {this.id = id;}@Overridepublic int hashCode() {return id.hashCode();}}public static void main(String[] args) {Map<key, string=""> m = new HashMap<key, string="">();while (true)for (int i = 0; i < 10000; i++)if (!m.containsKey(i))m.put(new Key(i), "Number:" + i);}
}

当您执行上面的代码时,您希望它可以永久运行,不会有任何问题-毕竟,构建的幼稚缓存解决方案应该只扩展到10,000个元素,然后停止增长,因为所有键都已经存在于HashMap中 。 但是,情况并非如此-元素会继续添加,因为Key类在其hashCode()旁边不包含适当的equals()实现 。 该解决方案很容易–与下面的示例类似,添加equals()方法的实现,您很高兴。 但是,在设法找到原因之前,您肯定已经失去了一些宝贵的脑细胞。

@Override
public boolean equals(Object o) {boolean response = false;if (o instanceof Key) {response = (((Key)o).id).equals(this.id);}return response;
}

让您的朋友保持清醒的第二个问题-一些操作中的字符串处理。 像魅力一样工作,特别是与JVM版本差异结合使用时。 在JDK 7u6中更改了 String内部构件的工作方式,因此,如果您设法找到仅次要版本导致生产和登台不同的环境,那么您就已经准备就绪了 。 向您的朋友扔出类似于以下代码的代码,以进行调试,并想知道为什么问题不在生产中出现在其他任何地方。

class Stringer {static final int MB = 1024*512;static String createLongString(int length){StringBuilder sb = new StringBuilder(length);for(int i=0; i < length; i++)sb.append('a');sb.append(System.nanoTime());return sb.toString();}public static void main(String[] args){List<string> substrings = new ArrayList<string>();for(int i=0; i< 100; i++){String longStr = createLongString(MB);String subStr = longStr.substring(1,10);substrings.add(subStr);}}
}

上面的代码中发生的事情–当它在JDK 7u6之前的版本上运行时,返回的子字符串在下面保留了对〜1MB大字符串的引用。 因此,当使用-Xmx100m运行示例时,您将遇到意外的OutOfMemoryException。 将此与平台差异结合起来,在您正在实验的环境中使用不同的JDK版本,第一批白发将蓬勃发展。 现在,如果您想掩盖自己的足迹,我们可以将一些更高级的概念添加到产品组合中,例如 3D水龙头

  • 将损坏的代码加载到其他类加载器中,并在丢弃原始类加载器后模仿类加载器泄漏 ,保留对加载的类的引用。
  • 将有问题的代码隐藏到finalize()方法中,使症状真正不可预测
  • 将长时间运行的线程的复杂技巧折腾,将某些内容存储在ThreadPool所访问的ThreadLocals中–受控应用程序线程

希望我们为您提供一些思考的东西,并为您下次生气时提供一些技巧。 无数小时的核心调试保证。 除非您的朋友使用Plumbr ,否则当然会为他找到泄漏。 但是公然的市场营销方面,我希望我们能够在两个简单的案例中证明在Java中创建内存泄漏有多么容易。 你们中的大多数人都经历过追踪这样一个错误的难度。 因此,如果您喜欢这篇文章,请订阅我们的Twitter feed,以得到有关我们未来有关JVM性能调整的内容的警报。

参考: 如何通过我们的JCG合作伙伴 Nikita Salnikov- Tarnovski 造成内存泄漏 ,请访问Plumbr Blog博客。

翻译自: https://www.javacodegeeks.com/2013/04/how-to-create-a-memory-leak.html

造成内存泄漏

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

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

相关文章

通过Java,Spring Boot应用程序将Gmail用作SMTP服务器

Gmail用户可以使用Gmail的SMTP服务器smtp.gmail.com从其Spring Boot应用程序发送电子邮件。 为此&#xff0c;让我们在应用程序中进行一些设置&#xff1a; 在application.properties文件中提供SMTP连接属性&#xff1a; spring.mail.hostsmtp.gmail.com spring.mail.username…

在建工地扬尘在线监控系统推荐_配电室为何需要安装蓄电池在线监控系统?保定钰鑫电气...

配电室蓄电池在线监控系统提高了蓄电池运行质量、增强了电力系统的安全运行、保障蓄电池运行环境的可靠&#xff0c;打造无人值守配电室、智能化运维模式&#xff0c;减少蓄电池损耗、浪费&#xff0c;降低了维护成本&#xff0c;为何需要安装一套配电室蓄电池在线监测系统&…

最好的Java开发人员测试和集成工具

通过从应用程序中学习企业APM产品&#xff0c;发现更快&#xff0c;更高效的性能监控。 参加AppDynamics APM导览&#xff01; 无论您是刚开始还是已经使用了一段时间&#xff0c;使用正确的工具进行编程都可以对项目的成功产生巨大的影响。 适当的工具使您可以编写更好的代码…

最速下降法matlab全局最小值_梯度下降概念

1、梯度概念(1)从几何意义上讲&#xff0c;就是函数变化最快的地方。在单变量的函数中&#xff0c;梯度只是导数&#xff0c;其实就是函数在某个给定点的切线的斜率&#xff1b;在多变量函数中&#xff0c;梯度是一个向量&#xff0c;向量有方向&#xff0c;梯度的方向就指出了…

IntelliJ中的远程调试Wildfly应用程序

远程调试Java应用程序意味着使用本地开发环境连接到远程运行的应用程序。 Java开箱即-agentlib:jdwp[options]支持远程调试&#xff1a;目标应用程序必须使用-agentlib:jdwp[options]选项执行&#xff0c; -agentlib:jdwp[options]选项加​​载Java调试线协议&#xff08;jdwp&…

+h eclipse中ctrl_Eclipse 常用的快捷键都有哪些?

今天&#xff0c;小编大概整理了 几 组 Eclipse 的快捷键&#xff0c;希望对你有帮助。1、打开资源CTRL SHIFT R&#xff1a;打开所有类型文件&#xff0c;不包括 JAR 包&#xff1b; CTRL SHIFT T&#xff1a;打开 Java 类型文件&#xff0c;包括 JAR 包&#xff1b;2、查…

apache.camel_Apache Camel 2.11发布

apache.camel上周Apache Camel 2.11发布了。 这篇博客文章总结了最引人注目的新功能和改进。 有关详细说明&#xff0c;请参见Camel 2.11发行说明 。 1&#xff09;新组件 与往常一样&#xff0c;每个新版本都包含许多新组件&#xff0c;这些组件是由我们庞大的用户群贡献的。…

c向文件中插入数据_Redis从文件中批量插入数据

简介在redis中&#xff0c;有时候需要批量执行某些命令&#xff0c;但是在redis的redis-cli下&#xff0c;只能一条条的执行指令&#xff0c;实在太麻烦了&#xff01;想到这&#xff0c;你是不是蓝瘦香菇&#xff1f; 如果能将要执行的指令一行行存储到文件中&#xff0c;然后…

python多级目录import_你真的会用Python模块与工具包吗?

在开发过程中&#xff0c;我们无法把所有代码、资源都放在同一个文件中。因此&#xff0c;模块导入在编码中是很常见的。无论是C、Java&#xff0c;还是Python、Go。可以把不同功能、不同模块进行分离&#xff0c;当使用的时候&#xff0c;可以通过import关键字在一个模块中使用…

八边形点坐标数的lisp_图形学入门第五课:齐次坐标

齐次坐标(Homegeneous Coordinates)在学习齐次坐标之前&#xff0c;我们要先好奇的问一下&#xff0c;为什么要学习齐次坐标。上一节课&#xff0c;我们学习了变换的三种基本形式&#xff1a;旋转&#xff0c;缩放&#xff0c;和切变。但是还有一种特殊的变换&#xff1a;Trans…

对速度的需求,访问现有数据的速度提高了1000倍

了解如何通过使用标准Java 8流和Speedment的In-JVM-Memory加速器将分析数据库应用程序加速1000倍。 Web和移动应用程序有时会很慢&#xff0c;因为后备数据库很慢和/或与数据库的连接施加了延迟。 现代UI和交互式应用程序需要快速后端&#xff0c;并且理想情况下没有可观察到的…

mysqls压力测试怎么用_用 Swagger 测试接口,怎么在请求头中携带 Token?

松哥周末抽空给 Spring Security 系列也录制了一套视频&#xff0c;目录如下&#xff1a;感兴趣的小伙伴戳这里-->Spring BootVue微人事视频教程今天的话题来自一个小伙伴在微信上的提问&#xff1a;看到这个问题&#xff0c;松哥忽然想到我自己之前写过 Spring BootSwagger…

安卓手机背景变黑色怎么改_别着急扔掉旧手机 你的电脑可能需要它

PC玩家中&#xff0c;不少人都会有在玩游戏时观测电脑硬件状态的习惯。比如查看游戏帧数、CPU频率、GPU频率或是温度等。大多数人都是通过第三方软件&#xff0c;在游戏内把监测数据显示到电脑显示屏角落。可就算是在角落&#xff0c;这些数据依旧会阻挡游戏画面&#xff0c;在…

JDeps入门–分析项目的依赖关系

JDeps是Java依赖关系分析工具 &#xff0c;这是一个命令行工具&#xff0c;它处理Java字节码&#xff08;意味着.class文件或包含它们的JAR&#xff09;&#xff0c;并分析类之间静态声明的依赖关系。 可以用各种方式过滤结果&#xff0c;并可以将其汇总到包或JAR级别。 JDeps还…

禅道开源版用户手册_Docker搭建开源版禅道以及项目基本流程介绍

对于自学软件测试的同学来说&#xff0c;经常会遇到这样的困惑&#xff1a;测试用例怎么写&#xff1f;有啥好的模板&#xff1f;缺陷提交的模板是什么样的&#xff1f;bug的生命周期是啥&#xff1f;项目的流程是啥&#xff1f;以上这些困惑&#xff0c;在你仔细看完这篇文章后…

f12 卡 谷歌浏览器_抢券第二课:利用浏览器F12获取优惠券请求链接

抢券第二课为什么迟迟不来呢&#xff1f;因为最近京东没有那种神券需要定点抢购的&#xff0c;我也没法测试我的理论。现在京东的券随时可以领取到&#xff0c;我多没法测试的东西不想就这样欺骗你们。所以今天的第二课我们讲一讲神奇的谷歌浏览器F1201 工具准备一、浏览器这里…

Java命令行界面(第5部分):JewelCli

细算在Java命令行处理与Apache的百科全书CLI &#xff0c; args4j &#xff0c; jbock和命令行中先前的文章&#xff0c;我把注意力转向在这个岗位使用JewelCli完成的命令行参数相似的处理Java中。 几个Java命令行处理库使用批注来定义命令行选项。 到目前为止&#xff0c;本系…

dnf用虚拟机会被制裁吗_DNF: 神豪奶妈扬言, 战斗力没有超过他的, 都不配被加buff!...

要说到现在的年轻人们的交友方式绝对少不了游戏交友&#xff0c;以前的人们只要不出门那就是与世隔绝&#xff0c;而现在就算是不出门也可以在网络上结交一大帮朋友&#xff0c;游戏就是现在的年轻人们交友最多的地方之一。科技的发展让游戏进入了一个繁荣的春天&#xff0c;不…

什么叫轻量瓷_为什么说陶瓷是华夏文明的徽章?

一、先说何为徽章&#xff1f;徽&#xff0c;最基本的解释是标志、符号&#xff1b;章&#xff0c;基本释义较多&#xff0c;其之一为佩戴在身上的标志&#xff0c;如领章、胸章等。徽章&#xff0c;也就是佩戴在身上用以表示身份、职业或者荣誉的标志。徽章的作用是明确身份、…

Java命令行界面(第10部分):picocli

picocli主页面将picocli描述为“强大的微小命令行界面”&#xff0c;“ picocli”是一个文件Java框架&#xff0c;用于解析命令行参数并生成精美&#xff0c;易于定制的用法帮助消息。 有颜色。” 这篇文章简要介绍了如何使用Picocli 0.9.7处理Java代码中的命令行参数。 像本系…