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,一经查实,立即删除!

相关文章

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 --> …

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

无论是在Linux下还是在Solaris下都安装过很多次Oracle&#xff0c;几乎都没成功过。最开始安装的时候连安装页面都见不到&#xff0c;后来&#xff0c;能够看到安无论是在Linux下还是在Solaris下都安装过很多次Oracle&#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;值得一试。 在线演示 源码下载…

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

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

Javascript执行上下文和执行栈

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

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

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

Hyhyhy – 专业的 HTML5 演示文稿工具

Hyhyhy 是创建好看的 HTML5 演示文档的工具。它具备很多的特点&#xff1a;支持 Markdown&#xff0c;嵌套幻灯片&#xff0c;数学排版&#xff0c;兼容性&#xff0c;语法高亮&#xff0c;使用 Javascript API &#xff0c;方便的骨架。它支持 Firefox 2 , Safari 3 , Opera 9…

Java开发知识之Java的枚举

Java开发知识之Java的枚举 一丶什么是枚举 枚举可以理解为就是常量,在Java中我们定义常量.都是用 final语句. C中都是用const关键字. 枚举跟C概念都是一样的.就是特定的常量而已. 二丶Java中的枚举 java中的常量.一般都是final定义.但是我们讲过.final定义的常量.初始化的时候可…

linux php7 mongodb,CentOS 7下安装配置PHP7跟LAMP及MongoDB和Redis

CentOS 7下安装配置PHP7跟LAMP及MongoDB和Redis我是想能yum就yum&#xff0c;所有软件的版本一直会升级&#xff0c;注意自己当时的版本是不是已经更新了。首先装CentOS 7装好centos7后默认是不能上网的cd /etc/sysconfig/network-scripts/找到形如ifcfg-enp0s3的文件&#xff…

基于 Bootstrap 的响应式后台管理面板

你想建立一个后台管理面板或者分析仪表板吗&#xff1f;不需从头开始&#xff0c;Keen IO Bootstrap 是一个响应式的仪表盘模板&#xff0c;可以帮助你在几分钟内呈现数据&#xff0c;让你可以创建一个有吸引力的&#xff0c;定制的分析仪表板&#xff0c;随时可以展现给你的团…

sparkstreaming监听hdfs目录_大数据系列之Spark Streaming接入Kafka数据

Spark Streaming官方提供Receiver-based和Direct Approach两种方法接入Kafka数据&#xff0c;本文简单介绍两种方式的pyspark实现。1、Spark Streaming接入Kafka方式介绍Spark Streaming 官方提供了两种方式读取Kafka数据&#xff1a;一是Receiver-based Approach。该种读取模式…

时间服务器

时间服务器配置&#xff1a; 1 安装软件包: [rootlocalhost ~]# yum install ntp –y 2 修改配置文件 [rootlocalhost ~]# vim /etc/ntp.conf # 允许内网其他机器同步时间 192.168.1.0该网段 restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap 允许任何ip的客户机都可以…

使用 HTML5 Canvas 绘制出惊艳的水滴效果

HTML5 在不久前正式成为推荐标准&#xff0c;标志着全新的 Web 时代已经来临。在众多 HTML5 特性中&#xff0c;Canvas 元素用于在网页上绘制图形&#xff0c;该元素标签强大之处在于可以直接在 HTML 上进行图形操作&#xff0c;具有极大的应用价值。 这里分享一个惊艳的 Canva…

mysql 字符串类型 char varchar

字符类型用在存储名字、邮箱地址、家庭住址等描述性数据 char指的是定长字符&#xff0c;varchar指的是变长字符 #官网&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/char.html #注意&#xff1a;char和varchar括号内的参数指的都是字符的长度#char类型&#xff1a;定长…

二叉树遍历规则

树的遍历顺序大体分为三种&#xff1a;前序遍历&#xff08;先根遍历、先序遍历&#xff09;&#xff0c;中序遍历&#xff08;中根遍历&#xff09;&#xff0c;后序遍历&#xff08;后根遍历&#xff09;。 如图所示二叉树&#xff1a; 前序遍历&#xff1a;前序遍历可以记为…