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

造成内存泄漏

这将是一个相当邪恶的职位-当您确实希望使某人的生活陷入困境时,您将在谷歌上搜索。 在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,一经查实,立即删除!

相关文章

寄存器分配图着色_寄存器分配

寄存器分配&#xff0c;是通过将程序变量尽可能地分配到寄存器&#xff0c;从而提高程序执行速度的一种方法。寄存器是编译器优化中最为重要的问题之一(好的寄存器分配能够提高程序执行速度超过250%)&#xff1b;也是编译器理论中最热点的研究领域之一(研究界已经提出来大量寄存…

通过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;梯度的方向就指出了…

jpa querydsl_JPA – Querydsl投影

jpa querydsl在我的上一篇文章中&#xff1a; JPA –基本投影 –我提到了构建JPA投影的两种基本可能性。 这篇文章为您带来了更多示例&#xff0c;这次基于Querydsl框架。 注意&#xff0c;这里我指的是Querydsl版本3.1.1。 重塑构造函数表达式 看下面的代码&#xff1a; ...…

同步服务老是报错_悬而未决:MYSQL配置好主从同步后没有报错,但数据一直没有同步过来是什么原因? | 学步园...

我是用下面的步骤来配置主从数据库服务器(都是MYSQL 5.1.47)的&#xff1a;1、在主服务器上FLUSH TABLES WITH READ LOCK;然后再复制数据库文件到从服务器。2、在主服务器上创建同步用户账号rsyncuser。修改my.cnf开启主服务器上的bing-log&#xff0c;没有指明binlog-do-db&am…

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

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

云桌面 瘦终端_云桌面选择云终端还是瘦客户机?

我们发现最近很多用户在部署青椒云桌面的时候&#xff0c;经常会出现这么一种情况&#xff0c;那就是不知道是该选择云终端还是瘦客户机而不断纠结的&#xff0c;云终端和瘦客户机到底有什么不同的呢&#xff0c;为什么经常会有很多用户因为不知道如何选择它们而感到纠结的呢&a…

cordic ip核 vivado_Xilinx Vivado CORDIC IP求解atan 反正切

赛灵思官方提供了cordic(coordinate rotational digital computer) ip核实现直角坐标极坐标变化&#xff0c;三角函数的操作。我介绍下它进行反正切求解的使用&#xff1a;新建个简单工程&#xff1a;bd如下进行ip设置&#xff0c;选择运算位反正切后&#xff0c;ip端口回自动变…

检测和测试停滞的流– RxJava常见问题解答

假设您有一个流以不可预测的频率发布事件。 有时您可以预期每秒会有数十条消息&#xff0c;但是偶尔几秒钟都看不到任何事件。 如果您的流是通过Web套接字&#xff0c;SSE或任何其他网络协议传输的&#xff0c;则可能会出现问题。 静默时间过长&#xff08;停顿&#xff09;可以…

linux 远程挂载摄像头_如何实现嵌入式Linux下USB摄像头视频采集

展开全部在linux下所e5a48de588b662616964757a686964616f31333337613134有设备都是文件。所以对摄像头的操作其实就是对文件的操作。USB摄像头的设备文件就是在/dev目录下的video0(假如只有一个摄像头)。在linux下操作摄像头就是使用v4l2对摄像头进行视频的操作&#xff0c;操作…

Effective Java第三版有哪些新功能?

自从听说即将出版的有效Java 第三版以来&#xff0c;我一直想知道其中有什么新内容。 我假设将涵盖自Java 6以来引入Java的功能&#xff0c;的确如此。 但是&#xff0c;第三版Java开发人员经典版也有一些其他更改。 在本文中&#xff0c;我提供了有关在第三版中添加&#xff0…

es管理kabina_小白学ES 05 - 通过Kibana管理集群服务

目录前述步骤:① 启动Kibana;② 通过浏览器访问Kibana;③ 进入Dev Tools(开发者工具)界面.1 检查集群的健康状况ES提供了一套_cat API, 可以查看ES中的各类数据.# 查询API:GET /_cat/health?v# 响应信息如下:epoch timestamp cluster status node.total node.data shards pri …

+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;然后…

用杰克逊流式传输大型JSON文件– RxJava常见问题解答

在上一篇文章中&#xff0c;我们学习了如何解析过大的XML文件并将其转换为RxJava流。 这次让我们看一个大的JSON文件。 我们的示例将基于微小的colors.json&#xff0c;其中包含将近150种这种格式的记录&#xff1a; {"aliceblue": [240, 248, 255, 1],"antiqu…

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

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

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

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