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

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

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

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

相关文章

label 标签里面元素点击事件

想做一个单击显示,单击消失的效果,两个元素都在label标签里面,通过打log发现,当点击消失的时候,先执行了消失的单击事件,有执行了出现的单击事件,所以元素并没有消失,这个出现的原因…

java contenttype_POST不同提交方式对应的Content-Type,及java服务器接收参数方式

简介:Content-Type(MediaType),即是Internet Media Type,互联网媒体类型;也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息.参考response.Header里常见Content-Type一般有以下四种&…

Java 进程占用 VIRT 虚拟内存超高的问题研究

一、现象说明 最近发现线上机器java 7(openjdk)进程的 VIRT 虚拟内存使用达到了 50G,如下所示: PID    USER  PR NI VIRT  RES SHR S   %CPU   %MEM   TIME   COMMAND 3130   tomcat  20 0 9128m  1.4g 6544 S…

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

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

聊聊一直困扰前端程序员的浏览器兼容-【css】

1.为什么会出现浏览器兼容问题? 由于各大主流浏览器由不同的厂家开发,所用的核心架构和代码也很难重和,这就为各种莫名其妙的Bug(代码错误)提供了温床。再加上各大厂商出于自身利益考虑而设置的种种技术壁垒,让CSS应用…

权限提升

UACMe – Defeat Windows User Account Control (UAC) https://github.com/hfiref0x/UACME MiniHook Lib project https://github.com/TsudaKageyu/minhook CrackMapExec – Active Directory Post-Exploitation Tool https://www.darknet.org.uk/2017/07/crackmapexec-active-…

java getrealpath_JavaEE路径陷阱之getRealPath

绝对不要使用ServletContext的getRealPath方法获取Web应用的路径!应该使用ServletContext的getResource()方法,直接使用相对于Web应用根目录的相对路径来获取资源。ServletContext接口中定位资源的方法getResourcejava.net.URL getResource(java.lang.St…

与客户患难与共

在採訪Werner Vogels(亚马逊的首席技术官)的过程中,他描写叙述了亚马逊的开发者是怎样跟他们的用户保持沟通的:记住。我们的大部分开发者都跟客户保持着良好的接触,因此他们对“客户喜欢什么”、“客户不喜欢什么”、“…

Camel 2.11 –没有Spring的Camel Web应用程序

在撰写本文时,我们刚刚向即将到来的Apache Camel 2.11添加了一个新组件,该组件允许使用Camel运行Web应用程序,而不必依赖Spring Framework来加速Camel。 或与此相关的任何其他第三方框架。 有点as愧地说,在2013年,我们…

关于盒模型的一点总结

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

java 反射机制性能_Java反射机制的用途和缺点

Java反射机制的用途和缺点反射的用途 Uses of ReflectionReflection is commonly used by programs which require the ability toexamine or modify theruntime behavior of applications running in the Java virtual machine. Thisis a relatively advancedfeature and shou…

最近的生活

这个暑假主要时间都在公司实习,没有去自己学习很新的一些技术,因为现在这个公司的技术栈不是特别的新,不过实习了一段时间发现,其实技术栈新不新和你一个新手根本就没有半毛钱关系,根基不牢学什么白搭是吧 举个例子&am…

将大型项目从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>"红色部分代…

java生成带文字的图片_Java在背景图片上面加文字或者文字自动生成图片

正巧遇到一个项目需要图片合成&#xff0c;查阅了网上许多资料之后整理了一份生成图片的工具类&#xff0c;代码如下&#xff1a;package org.yygzs.acker.util;import java.io.IOException;import javax.imageio.ImageIO;import java.io.File;import java.awt.Font;import jav…

style对象的cssText方法

cssText 本质是什么&#xff1f; cssText 的本质就是设置 HTML 元素的 style 属性值。 cssText 怎么用&#xff1f; domElement.style.cssText "color:red; font-size:13px;"; cssText 返回值是什么&#xff1f; 在某些浏览器中&#xff08;比如 Chrome&#xff09…

Spring的Web MVC –重定向到内存泄漏

他们说一块岩石会引起雪崩。 最近&#xff0c;我的一位同事Marcin Radoszewski给了我一块岩石。 您可能永远都不会猜测它是什么&#xff0c;但是有机会在许多Web应用程序中使用它。 请允许我向您介绍这块石头。 您可能很清楚发布模式后的重定向 。 使用Spring Framework&#…

Android 学习Kotlin吗?

学习Kotlin吗&#xff1f;转载于:https://www.cnblogs.com/zhujiabin/p/8398185.html