增加堆大小–谨防眼镜蛇效应

“眼镜蛇效应”一词源于英国殖民印度统治英国时所产生的轶事。 英国政府担心毒蛇眼镜蛇的数量。 因此,政府对每条死蛇给予悬赏。 最初,这是一个成功的策略,因为大量蛇被杀死以获取奖励。 最终,印度人开始养殖眼镜蛇以赚取收入。

当意识到这一点时,奖励就被取消了,但是眼镜蛇饲养者放开了蛇,因此野生眼镜蛇成倍增加。 解决问题的明显办法使情况更加恶化。

那么Java堆大小与殖民地印度和毒蛇有何关系? 忍受我,我将以现实生活中的故事为参考来指导您进行类比。 Cobra 术语“眼镜蛇效应” 您已经创建了一个了不起的应用程序。 令人惊讶的是,它变得真正流行,并且新服务的庞大流量开始使您的应用程序屈服。 通过浏览性能指标,您可以确定可用于应用程序的堆数量很快将成为瓶颈。

因此,您需要花一些时间来启动具有原始堆六倍的新基础结构。 您测试您的应用程序以验证它是否有效。 然后,您可以在新的基础架构上启动它。 投诉立即涌入–您的应用程序变得比原始的2GB小堆响应速度慢。 您的某些用户在等待您的应用程序响应时会遇到几分钟的延迟。 刚刚发生了什么事?

当然有很多原因。 但是,让我们关注最可能的嫌疑犯–堆大小更改。 这有一些可能的副作用,例如延长缓存预热时间,碎片问题等。但是从出现的症状来看,您可能会在完整的GC运行期间在应用程序中遇到延迟问题 。

这意味着-因为Java是一种垃圾收集语言-JVM内部进程会定期对您使用的堆进行垃圾收集。 就像人们可能期望的那样-如果您有更大的房间要打扫,那么看门人通常会花费更多的时间来打扫房间。 这同样适用于从内存中清除未使用的对象。

在小堆(小于4GB)上运行应用程序时,通常不需要考虑GC内部。 但是,当将堆大小增加到数十GB时,您绝对应该意识到整个GC可能导致的世界停顿。 对于较小的堆大小,也确实存在相同的暂停,但是它们的长度明显缩短了–您现在暂停超过一分钟的暂停本来可能只跨越了几百毫秒。

那么,如果您确实需要更多应用程序堆,该怎么办?

  • 第一种选择是考虑水平缩放而不是垂直缩放。 对于我们当前的情况,这意味着–如果您的应用程序是无状态的或易于分区的,则只需添加更多的小节点并平衡它们之间的负载即可。 在这种情况下,您可以坚持使用32位架构,这也会占用较小的内存 。
  • 如果无法进行水平缩放,则应专注于GC配置。 如果您要等待的是延迟,那么您应该忘记面向吞吐量的世界一流GC,并开始寻找替代方案。 您很快会发现它们仅限于并发标记和扫描(CMS)或垃圾优先(G1)收集器。 最可悲的消息是,只有通过实验才能找到这两种收集器类型和其他堆配置参数之间的最佳选择。 因此,不要仅通过阅读一些东西,走出去然后尝试一下实际的生产负荷来做出选择。

但也要注意它们的局限性-这两个收集器都给您的应用程序带来了吞吐量开销-特别是G1的吞吐量数字往往比世界其他同类产品差。 而且,如果CMS垃圾收集器的速度不够快,无法在永久性生成器已满之前完成操作,则它会退回到标准的世界各地GC。 因此,对于大小为16 GB及以上的堆,您仍然可以面对30秒或更长时间的暂停。

  • 如果您无法在Oracle JVM附带的垃圾收集器上进行水平扩展或无法达到所需的延迟结果,那么您也可以考虑Azul Systems构建的Zing JVM 。 使Zing脱颖而出的功能之一是无休止的垃圾收集器(C4) ,这可能正是您所需要的。 但是,要全面披露–我们尚未在实践中尝试过C4。 但这听起来很酷。
  • 最后选择是真正的硬核家伙。 您可以在堆外部分配内存。 这些分配显然对垃圾收集器不可见,因此不会被收集。 这听起来可能很可怕,但是从Java 1.4开始,我们已经可以访问java.nio.ByteBuffer类,该类为我们提供了一种用于堆外内存分配的方法allocateDirect()。 这使我们可以创建非常大的数据结构,而不会遇到数秒的GC暂停。 这种解决方案并不太常见-许多BigMemory实现都在后台使用ByteBuffer。 例如, 兵马俑BigMemory和Apache DirectMemory 。

结论—即使有良好的意愿进行更改,也要注意替代方案和后果。 就像印度政府过去公布死眼镜蛇的报酬一样 。

参考: 增大堆大小–在Plumbr Blog博客上, 请注意我们JCG合作伙伴 Nikita Salnikov Tarnovski 的Cobra 。

翻译自: https://www.javacodegeeks.com/2012/12/increasing-heap-size-beware-of-the-cobra-effect.html

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

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

相关文章

如何创建可扩展的Java应用程序

开放的扩展使许多应用程序受益。 这篇文章描述了两种在Java中实现这种可扩展性的方法。 可扩展的应用 可扩展应用程序是可以扩展其功能而不必重新编译它们 ,有时甚至不必重新启动它们的应用程序。 只需将jar添加到类路径中,或通过更复杂的安装过程来实现…

关于盒模型的一点总结

标准w3c盒模型图示 关于怪异盒模型和标准盒模型的对比 关于怪异盒模型盒标准盒模型之间的转换

Day 9 函数的初识1

def my_len(): l1 [1,2,3,5,6] print(111) print(222) return print(333)print(my_len())一、函数的定义1.遇到return ,此函数结束,if 不在向下进行:2.return 的返回值 1. 不写return 返回为none 2. return non ,和1 …

将大型项目从Ant迁移到Maven

事实是,我们处在艰难时期。 我们花了将近三个月的时间将构建机制从Ant迁移到Maven 。 如果您打算在大型项目中做同样的事情,那就是您必须安排的最短时间。 我们仍在努力解决这种迁移带来的一些附带影响,但幸运的是,它们并不是那么…

移动端布局方案探究

研究了淘宝,天猫和网易彩票163的wap主页样式布局,总结移动端布局方案 注意:代码运行是file协议,在chrome里不支持引用本地文件,会提示跨域错误,可以用firefox或者Safari打开 当时做的ppt下载: 2015年12月移…

搭建springboot环境

1.前戏准备: SpringBoot核心jar包:这里直接从Spring官网下载了1.5.9版本. jdk:jdk1.8.0_45. maven项目管理工具:3.5版本. tomcat:8.5版本. 本地仓库:注意settings.xml里面的设置"<localRepository>E:/SpringBoot/repository</localRepository>"红色部分代…

.Net Core 2.0 生态(1).NET Standard 2.0 特性介绍和使用指南

.NET Standard 2.0 发布日期&#xff1a;2017年8月14日公告原文地址 前言 早上起来.NET社区沸腾了&#xff0c;期待已久的.NET Core 2.0终于发布&#xff01;根据个人经验&#xff0c;微软的产品一般在2.0时会趋于成熟&#xff0c;所以一个新的.Net开发时代已经来临&#xff01…

jquery中的创建节点和添加节点的方法

今天来说一下针对jquary关于创建节点和添加节点的方法&#xff0c;先来看看创建节点&#xff1a; 1、直接添加节点内容即可 $("div").append(<a href"http://www.baidu.com">百度一下</a>); 2、可以创建jquary对象添加进去 var $li$(<a hre…

移动端 fixed 固定按钮在屏幕下方,然后按钮被键盘顶上来...顶上来了有没有~

在移动端 H5 页面开发中&#xff0c;我使用了 fixed 固定某个元素在屏幕的最下方&#xff0c; 这时点击输入框&#xff0c;接着非常非常自然地出现了元素被系统键盘顶起来的情况&#xff0c;如下图。 解决方案: 首先&#xff0c;给页面最外层包裹一层 div(相对定位) &#xf…

momentum公式

momentum对于w的更新公式&#xff1a; http://caffe.berkeleyvision.org/tutorial/solver.html转载于:https://www.cnblogs.com/ymjyqsx/p/7364743.html

带弹簧的Hazelcast分布式执行

ExecutorService功能是Java 5附带的&#xff0c;位于java.util.concurrent包中。 它扩展了Executor接口&#xff0c;并提供了线程池功能来执行异步简短任务。 建议使用Java Executor服务类型来查看基本的ExecutorService实现。 此外&#xff0c;ThreadPoolExecutor是ExecutorS…

Manacher's Algorithm 马拉车算法(最长回文串)

这个马拉车算法Manacher‘s Algorithm是用来查找一个字符串的最长回文子串的线性方法&#xff0c;由一个叫Manacher的人在1975年发明的&#xff0c;这个方法的最大贡献是在于将时间复杂度提升到了线性&#xff0c;这是非常了不起的。对于回文串想必大家都不陌生&#xff0c;就是…

java咖啡机故障5_【咖啡小常识】咖啡机不得不知道的常见故障及解决方法

原标题&#xff1a;【咖啡小常识】咖啡机不得不知道的常见故障及解决方法咖啡行业交流请加私人微信精品咖啡香&#xff0c;微信号&#xff1a;(长按复制)thinkingcapacity一&#xff0e;没有蒸汽或做出的咖啡不热可能原因1、在一个时间段放出了大量的热水(不建议使用咖啡机自带…

idiom的学习笔记(一)、三栏布局

三栏布局左右固定&#xff0c;中间自适应是网页中常用到的&#xff0c;实现这种布局的方式有很多种&#xff0c;这里我主要写五种。他们分别是浮动、定位、表格、flexBox、网格。 在这里也感谢一些老师在网上发的免费教程&#xff0c;使我们学习起来更方便&#xff01;&#x…

USB之HID类Set_Report Request[调试手记1]

请翻开《Device Class Definition for Human Interface Devices (HID) Version 1.11 》7.2.2 Set_Report Request 现在我们先那键盘来做实验来观察。[备注:测试当时NUM指示灯亮] 通过笔记本上按“capslock”按键来观察外置键盘上大小写的指示灯。 通过USBlyzer观察到 发送03的…

Devoxx 2012:Java 8 Lambda和并行性,第1部分

总览 Devoxx是世界上最大的独立于供应商的Java会议&#xff0c;于11月12日至16日在比利时的Atwerp举行。 今年规模更大了&#xff0c;来自40个不同国家的3400名与会者。 和去年一样 &#xff0c;我和来自SAP的一小群同事都来了&#xff0c;并享受了很多。 在Nao机器人令人印象…

前端常见的十七个框架

本文作者祈澈姑娘&#xff0c;转载请声明 前端的技术日渐更新&#xff0c;最近得空&#xff0c;花了一上午的时间&#xff0c;将前端常见的框架总结了一下&#xff0c;在开发的过程之中&#xff0c;有了这些&#xff0c;不断能够提高自己的工作效率&#xff0c;还可以在工作之余…

Cesium调用Geoserver发布的 WMS、WFS服务

1 GeoServer服务发布 1.1 WMS服务 下载GeoServer安装版安装&#xff0c;同时安装geopackage扩展&#xff0c;以备使用。使用XX地图下载器下载地图&#xff0c;导出成GeoPackage地图文件。 &#xff08;1&#xff09;下载 GeoPackage DEM数据 &#xff08;2&#xff09;打开GeoS…

如何用ThreadLocals射击自己

它将很好地启动。 像大多数故事一样。 您会发现一个新概念&#xff0c;并对其功能感到惊讶。 然后突然装备了这把新锤子&#xff0c;一切开始看起来像钉子。 根据我们过去几个月的经验&#xff0c; java.lang.ThreadLocal真是一锤定音。 我想这全都归结为ThreadLocal的工作原理…

确保任务的执行顺序

有时有必要对线程池中的任务施加一定的顺序。 JavaSpecialists通讯的第206期提出了一种这样的情况&#xff1a;我们有多个连接&#xff0c;使用NIO可以从中读取。 我们需要确保给定连接中的事件按顺序执行&#xff0c;但是不同连接之间的事件可以自由混合。 我想提出一个类似但…