如何造成内存泄漏

这将是一个相当邪恶的职位-当您确实希望使某人的生活陷入困境时,您将在谷歌上搜索。 在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/368873.shtml

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

相关文章

javascript 之异常处理try catch finally--05

语法结构 try catch finally是ECMAScript-262 第三版提供异常处理机制的标准&#xff0c;语法结构如下&#xff1a; 1 try{ 2 //可能会发生的错误代码 3 } 4 catch(error){ 5 //错误处理 6 }finally{ 7 //无论是否有异常都会执行 8 } 语法与大多数语言一样 如java .net&#x…

CSS实现文本周围插入符号

CSS实现文本周围插入符号的方案 本文要讨论的是如何在文本的周围插入图标&#xff0c;怎么样控制它们之间的位置关系&#xff0c;通过HTML结构合理性与CSS属性的使用来比较不同方案所实现效果的优缺点。 常见设计稿要求 在文本前、后、上、下插入图标、线条、三角形、圆形插…

mysql动态sql是什么,mysql中动态sql的一次实际应用

一、前言本次实际应用中&#xff0c;使用到了如下几个要点&#xff1a;mysql的动态建表;mysql的多表插入;mysql的多表更新;mysql的多表删除;二、使用场景2.1 动态建表要求建立多个表&#xff0c;例如电压、电流等表&#xff0c;这些表的字段是完全一样的&#xff0c;只有表名不…

Spring MVC会话教程

会话管理是每个Web应用程序必不可少的部分。 由于Spring MVC是用于Web开发的功能强大的框架&#xff0c;因此它具有自己的工具和API与会话进行交互。 今天&#xff0c;我打算向您展示Spring MVC应用程序中会话处理的基本方法。 这意味着处理表单&#xff0c;将对象添加到会话中…

如何运行开源的安卓项目?

第一步:进入github开源安卓项目中&#xff0c;点击clone 第二步&#xff1a;打开android studio&#xff0c;选择checkout从Git中迁出项目 将github的地址复制进去 第三步&#xff1a;系统会自动下载&#xff0c;加载一段时间。然后出现下面的就算是结束了。 最后&#xff0c;运…

fis pure开发php,50个精品网站鉴赏

50个精品网站鉴赏介绍给大家的是几千个世界优秀网站中的精中之精的作品&#xff0c;都有非常不错的创意&#xff0c;推荐给众多网站的设计人员&#xff0c;好好借鉴一下别人是怎么设计网站的。这些网站主要的制作工具为FLASH&#xff0c;因为它有较好、较强的动态效果&#xff…

微信公众平台——被动回复用户消息

微信公众平台——被动回复用户消息 开发模式下的回复信息基础接口&#xff0c;可用来向用户回复文本消息、图片消息、语音消息、视频消息、小视频消息、地理位置消息、链接消息。 1、回复文本消息 function ReplyText(Msg: TMessage; MsgText: String): RawByteString; varX: I…

Java EE CDI bean范围

Java EE平台的上下文和依赖注入&#xff08;CDI&#xff09;是一项功能&#xff0c;可帮助将Java EE平台的Web层和事务层绑定在一起。 CDI是一组服务&#xff0c;可以一起使用&#xff0c;使开发人员可以轻松地在Web应用程序中使用企业bean和JavaServer Faces技术。 在CDI中&a…

php强类型 vscode,VSCode + WSL 2 + Ruby环境搭建图文详解

vscode配置ruby开发环境vscode近年来发展迅速&#xff0c;几乎在3年之间就抢占了原来vim、sublime text的很多份额&#xff0c;犹记得在2015-2016年的时候&#xff0c;ruby推荐的开发环境基本上都是vim和sublime text&#xff0c;然而&#xff0c;随着vscode的发展&#xff0c;…

关于网页导航栏制作的几种方法与常见问题解决(新人向)

无序列表是html页面排版经常用到的非常实用的标签&#xff0c;但是新手在使用无序列表时&#xff0c;经常会在横向排版上出现问题&#xff0c;笔者在这里提供了笔者在使用无序列表制作网页导航栏时的几种方法与常见问题的解决问题。&#xff08;以css内部样式为例&#xff09; …

html 语义化标签拾遗

1、del和ins标签 兼容性&#xff1a;浏览器全部支持 del&#xff1a;定义文档中已被删除的文本。 ins&#xff1a;定义已经被插入文档中的文本。 <!DOCTYPE html><html lang"zh"><head><meta charset"UTF-8" /><title>ht…

Spring MVC表单教程

本教程将展示如何在Spring MVC中处理表单提交。 我们将定义一个控制器来处理页面加载和表单提交。 您可以在GitHub上获取代码。 先决条件&#xff1a; 您应该有一个运行中的Spring MVC应用程序。 如果尚未设置正常的Spring MVC应用程序&#xff0c;请按照本教程进行操作 。 对…

我们十组的cantool装置的使用

十组的cantool装置的使用 下图是连接好的示意图&#xff0c;灯亮。 如果在串口关闭的时候输入C&#xff0c;cantool装置就会报错&#xff0c;因为串口是关闭的。正如需求文档里写的&#xff0c;当串口关闭&#xff0c;输入C要有返回\BEL的,关闭串口的前提是串口打开。 正确发送…

2018-05-05(在小程序中使用图标)

项目中常常需要使用到字体图标&#xff0c;微信小程序中使用字体图标与在平常的web前端中类似但是又有区别。下面以使用阿里图标为例子讲解如何在微信小程序中使用字体图标。 第一步&#xff1a;下载需要的字体图标 进入阿里图标官网http://iconfont.cn/搜索自己想要的图标&…

Django的模板系统

一、模板的组成 html代码和逻辑控制代码 二、逻辑控制代码的形式 1、变量&#xff08;使用双大括号引用变量&#xff09; a、template和context 语法 : {{ var_name }} 模板系统不仅可以传字符串&#xff0c;它可以传递任意对象&#xff0c;对于向列表、字典、元组等对象&…

Java SE 7 Update 25 –发行说明进行了解释。

昨天是CPU日。 Oracle通过6月的Java重要补丁更新发布了Java SE更新25 。 在4月的最后一次重大更新之后&#xff0c;这是与所有其他Oracle产品一起不符合Oracle关键补丁更新计划的最后一个更新。 从2013年10月开始 &#xff0c;Java安全修补程序将遵循四个年度安全发布周期。 但…

Ansible: hosts文件拆分为inventory和定义inventory全局变量

前言 随着管理机器的增多&#xff0c;我们在使用Ansible的时候时常会遇到hosts文件过于冗长的问题&#xff0c;极其不便于管理&#xff0c;而将hosts文件拆分为inventory就可解决该问题&#xff1b;另外&#xff0c;hosts中的每个主机条目需要指定用户名和私钥或密码&#xff0…

Eclipse中 如何实现 多行同时编辑

在编辑的时候按下 SHIFT ALT A 之后 鼠标变为 号 选择要同时编辑几行 即可编辑&#xff08;现在eclipse好像只能是编辑一块地方 不能像vs那样 任何地方可以同时编辑 这点很鸡肋&#xff09; 如图 退出编辑 再次 按 SHIFT ALT A 即可 转载于:https://www.cnblogs.com…

检测和删除多余无用的css

本文主要讲解如何检测页面中多余无用的css。 1、chrome浏览器 F12审查元素的Audits 说明&#xff1a;使用Audits&#xff0c;会检测出页面中没有用到的css&#xff0c;需要手动删除多余的css&#xff1b;同时需要说明的是检测出多余无用的css块&#xff0c;而不是某一行css。 …

vue支付密码

从网上搜索了好多都很麻烦&#xff0c;花了点事件自己做了个&#xff0c;简单轻便&#xff0c;老少皆宜 <template> <section class"pay-mask" click"close_mask" v-show"payshow"> <div class"container"> <div…