OutOfMemoryError:解决方案反模式

这些年来,我们一直密切关注以OutOfMemoryError消息的不同形式打包的问题。 通过专门的服务(例如Google警报),每天就特定关键字的新问题进行摘要,使我们对应用程序因日志中的java.lang.OutOfMemoryError失败而出现的情况有了一个很好的了解。

面临问题的人们往往会陷入细分市场,因此我决定对一些更有趣的角色进行一些描述。

疯狂的医生 自学成才的外科医生 。 这些家伙现在真正具有创造力,我绝对必须为此赞扬他们。 当遇到意外的错误消息时,他们提出了很多解释为什么可能发生此特定错误。 并立即解决该问题。

我已经多次看到以下所有内容,以至于我什至失去了计数。 我只能保证这些例子既真实又可怕:

  • “即使我购买了16G的额外RAM,我仍然收到OutOfMemoryError错误”。 好吧,与其增加-Xmx,对于许多人来说,最明显的解决方案似乎是转向疯狂购物。
  • “我的日志中遇到一个OutOfMemoryError,我发现一个.class文件的长度超过1500行。 摆脱掉消息,我的类文件必须有多小”。 如何获得类文件中的行数与堆空间用尽之间的相关性,这超出了我的范围,但是我想这种疯狂的做法是可行的。
  • “我从使用java.util.Vectors切换到java.util.ArrayList,花了一个月的时间来重构我的应用程序,但仍然出现OutOfMemoryError”。 好吧,对您有好处,Vectors如此1999年。但同样,如果您不知道是什么导致疾病的原因,为什么要治愈患者?

这个名单可能永远持续下去。 令我感到好奇的是-当软件开发人员的行为举止如此时-我下次还要去看医生时是否还应该格外小心?

电脑怪胎 配置H2x0rz 。 如果JVM配置中有一个参数,则必须对其进行调整。 这似乎是该特定人群的唯一真理。 确实,Oracle JVM工程师推荐的默认值有任何意义的机会是什么。 结果? 应用程序启动时的最小堆太大,线程优先级混乱,使用期限极低的使用区域或不合适的和/或实验性的GC算法。

不要误会我的意思,如果您知道自己在做什么,并且正在根据实际测量结果进行微调,那就继续吧。 通常,这些类型的用户从某个地方继承了“正确的配置选项集”,并且现在将相同的-XX参数集应用于那里看到的每个JVM。 求你了 您上次面对的具有高度事务性的Web应用程序与您现在唾手可得的数据繁忙的批处理作业完全不同。

内存模块堆 数据激增的受害者 。 这些家伙多年来一直在构建和运行业务应用程序而没有重大性能问题。 然后,雷电击中该应用程序在日志文件中出现OutOfMemoryErrors的情况下死在地面上。 通过执行一次将太多数据一次加载到内存中的操作,某些用户突然能够将整个应用程序运行到地面。

无论是由于业务良好而引起的,还是客户数量刚刚增长超过一定的魔点,还是公司收购并合并了一个使数据量增加一倍的竞争对手,效果都是一样的。

可以通过应用许多众所周知的工具和技术来解决这样的情况,当它们被识别时。 您可以推迟数据加载,小批量处理操作或更改负责存储此数据的数据结构-由您决定。 这些解决方案中的许多解决方案都非常合适。

但是,在这种情况下,我们看到的是将问题隐藏在增大的堆大小下。 通过增加配置中的-Xmx确实可以逃脱OutOfMemoryError,但是您仍然经常对用户造成伤害。 大型操作仍需要很长时间才能完成,因此,由于增加的延迟而使用户烦恼。 更糟糕的是,增加堆时,通常会导致GC暂停跨越到无法忍受的长度。

我的世界内存不足错误 我的世界 如果我必须选择一个负责内存泄漏的应用程序,那就是Minecraft。 多年来,我很可能看到成千上万沮丧的9岁儿童被迫处理堆配置。

快速搜索可以发现问题的严重性,对于那些考虑发布基于Java的桌面软件的人来说,我想这是一个很好的案例研究。

如果您不觉得自己属于所列的任何组,那就好。 您是务实的工程师之一,他们在通过总结得出结论之前,通过仔细研究因果关系来为自己的Craft.io感到自豪。

参考: OutOfMemoryError:来自JCG合作伙伴 IvoMägi的Pantibr Blog博客上的解决方案反模式 。

翻译自: https://www.javacodegeeks.com/2014/02/outofmemoryerror-solution-antipatterns.html

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

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

相关文章

python在线问卷调查系统源代码_基于Python 练习1情况的在线问卷

Q1. 您每个月的生活费是?(单选题)Q2. 您在职的职位是:(单选题)Q3. 您的家庭背景?(单选题)Q4. 下列哪一个是Python中正确的变量名?()(单选题)A Sprout*1B 1SproutC Sprout 1D Sprout_1Q5. Turtle 中的 Write 命令是用来做什么的 ()…

leetcood学习笔记-58-最后一个单词的长度

题目描述: 第一次解答: class Solution:def lengthOfLastWord(self, s: str) -> int:Ls.strip().split(" ")if L[-1]"" :return 0return len(L[-1]) 优化后: class Solution:def lengthOfLastWord(self, s: str) ->…

Plyr – 简单,灵活的 HTML5 媒体播放器

Plyr 是一个简单的 HTML5 媒体播放器,包含自定义的控制选项和 WebVTT 字幕。它是只支持现代浏览器,轻量,方便和可定制的媒体播放器。还有的标题和屏幕阅读器的全面支持。 在线演示 源码下载 您可能感兴趣的相关文章网站开发中很有用的 …

第一章 SpringBoot快速入门

1.1、包依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.14.RELEASE</version><relativePath/> <!-- lookup parent from repository --> …

使用Redis的简单消息队列

在本文中&#xff0c;我们将使用列表命令将Redis用作简单的消息队列。 假设我们有一个允许用户上传照片的应用程序。 然后在应用程序中&#xff0c;我们以不同大小显示照片&#xff0c;例如Thumb&#xff0c;Medium和Large。 在第一个实现中&#xff0c;我们可以承担在同一请…

solaris配置php,Solaris下安装Oracle_启动Oracle及监听

无论是在Linux下还是在Solaris下都安装过很多次Oracle&#xff0c;几乎都没成功过。最开始安装的时候连安装页面都见不到&#xff0c;后来&#xff0c;能够看到安无论是在Linux下还是在Solaris下都安装过很多次Oracle&#xff0c;几乎都没成功过。最开始安装的时候连安装页面都…

python es 数据库 ik_Linux系统:centos7下搭建ElasticSearch中间件,常用接口演示

一、中间件简介1、基础概念ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是当前流行的企业级搜索引擎…

【C++】满二叉树问题

/* 给出一棵满二叉树的先序遍历&#xff0c;有两种节点&#xff1a;字母节点&#xff08;A-Z&#xff0c;无重复&#xff09;和空节点&#xff08;#&#xff09;。要求这个树的中序遍历。输出中序遍历时不需要输出#。 满二叉树的层数n满足1<n<5。Sample Input: ABC#D#ESa…

NativeScript - JS 构建跨平台的原生 APP

使用 NativeScript&#xff0c;你可以用现有的 JavaScript 和 CSS 技术来编写 iOS、Android 和 Windows Phone 原生移动应用程序。由原生平台的呈现引擎呈现界面而不是 WebView&#xff0c;正因为如此&#xff0c;应用程序的整个使用体验都是原生的。 NativeScript 使您可以使用…

java乱码base64,解决 JAVA WebSocket 解析 base64 后中文字符串乱码

解决 JAVA WebSocket 解析 base64 后中文字符串乱码解决 JAVA WebSocket 解析 base64 后中文字符串乱码春风如贵客&#xff0c;一到便繁华。各位看官先赞再看&#xff0c;养成好习惯(●?&#xff40;●)前言&#xff1a;项目基于WebSocket实现了一个功能&#xff0c;其中要接受…

Riot - 比 Facebook React 更轻量的 UI 库

Riot 是一个类似 Facebook React 的用户界面库&#xff0c;只有3.5KB&#xff0c;非常轻量。支持IE8 浏览器的自定义标签&#xff0c;虚拟 DOM&#xff0c;语法简洁。Riot 给前端开发人员提供了除 React 和 Ploymer 之外的新选择&#xff0c;值得一试。 在线演示 源码下载…

python爬虫大众点评_Python爬虫(三)爬取大众点评网

大众点评的网站爬虫难点在于其对网页上的文字做了加密处理&#xff0c;所以学习了大佬的方法&#xff0c;链接如下&#xff1a;如下图所示&#xff0c;大众点评的评论数&#xff0c;价格和地址等信息对应在源码中都是方框&#xff0c;无法使用常规手段直接爬取到信息&#xff0…

[python3] torndb中的itertools.zip[AttributeError: module 'itertools' has no attribute 'izip']

在python3中&#xff0c;使用torndb进行查询时&#xff0c;遇到问题 AttributeError: module itertools has no attribute izip&#xff0c;解决该问题过程中耗费了不少时间&#xff0c;故把解决办法写下以便以后遇到该问题的人能更快速的解决&#xff1a; 因为python3中filter…

将jOOQ与Spring结合使用:代码生成

我们可能在本教程的第一部分中还记得jOOQ指出 jOOQ从您的数据库生成Java代码&#xff0c;并允许您通过其流畅的API构建类型安全的SQL查询。 本教程的第一部分描述了如何配置使用jOOQ的Spring驱动的应用程序的应用程序上下文&#xff0c;但没有描述如何使用jOOQ创建类型安全的S…

php文件上传 github,PHP的cURL文件上传

cURL介绍cURL是一个利用URL语法规定来传输文件和数据的工具&#xff0c;支持很多协议&#xff0c;如HTTP、FTP、TELNET等。PHP也支持cURL 库。本文将介绍 cURL 的一些高级特性&#xff0c;以及在PHP中如何运用它。PHP创建cURL的基本结构1)初始化curl_init()2)设置变量curl_seto…

FormatJS – 让你的 Web 应用程序国际化

FormatJS 是一个模块化的集合&#xff0c;保护各种 JavaScript 国际化库&#xff0c;例如格式化数字&#xff0c;日期和字符串。它包括一组建立在 JavaScript 的国际内置插件和全行业的国际化标准&#xff0c;再加上一套集成的通用模板和组件库。 在线演示 源码下载 您可能…

Javascript执行上下文和执行栈

什么是执行上下文&#xff1f; 执行上下文就是当前JavaScript代码被解析和执行时所在环境的抽象概念&#xff0c;JavaScript中运行任何的代码都是在执行上下文。 什么是执行栈&#xff1f; 执行栈&#xff0c;在其他编程语言中也被叫做调用栈&#xff0c;具有LIFO&#xff08;后…

rsa加密算法python_模拟新浪微博登录(Python+RSA加密算法)

声明&#xff1a;由于本人使用用的是Python语言&#xff0c;以下内容就在该语言下进行解释说明。有使用Java语言的可以参考IT男杂记(http://marspring.mobi/http-client-weibo/)正文&#xff1a;PC登录新浪微博时&#xff0c;在客户端用js预先对用户名、密码都进行了加密&#…

基于swagger进行接口文档的编写

0. 前言 近期忙于和各个银行的代收接口联调&#xff0c;根据遇到的问题&#xff0c;对之前编写的接口进行了修改&#xff0c;需求收集和设计接口时想到了方方面面&#xff0c;生产环境下还是会遇到意想不到的问题&#xff0c;好在基本的执行逻辑已确定&#xff0c;因此只是对接…

教程:编写自己的CDI扩展

今天&#xff0c;我将向您展示如何编写CDI扩展。 CDI提供了一种扩展功能的简便方法&#xff0c;例如 添加自己的范围&#xff0c; 启用Java核心类进行扩展&#xff0c; 使用注释元数据进行扩充或修改&#xff0c; 以及更多。 在本教程中&#xff0c;我们将实现一个扩展&a…