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

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

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

因此,您需要花一些时间来启动具有原始堆六倍的新基础结构。 您测试您的应用程序以验证它是否有效。 然后,您可以在新的基础架构上启动它。 投诉立即涌入–您的应用程序变得比原始的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

增加堆大小–谨防眼镜蛇效应相关推荐

  1. 增加堆内存的大小 - 提防眼镜蛇效应

    为什么80%的码农都做不了架构师?>>>    增加堆内存的大小 - 提防眼镜蛇效应 原文:http://plumbr.eu/blog/increasing-heap-size-be ...

  2. java 堆大小_适当的Java堆大小的5个技巧

    java 堆大小 确定生产系统合适的Java堆大小不是一件容易的事. 在我的Java EE企业经验中,由于Java堆容量和调整不足,我遇到了多个性能问题案例. 本文将为您提供5个技巧,这些技巧可以帮助 ...

  3. 适当的Java堆大小的5个技巧

    确定生产系统合适的Java堆大小不是一件容易的事. 在我的Java EE企业经验中,我发现由于Java堆容量和调整不足而导致的多个性能问题. 本文将为您提供5个技巧,这些技巧可以帮助您确定当前或新生产 ...

  4. bat java 指定堆大小_jvm 堆内存 栈内存 大小设置 查看堆大小

    1.在eclipse设置JVM参数 打开eclipse-窗口-首选项-Java-已安装的JRE(对在当前开发环境中运行的java程序皆生效,也就是在eclipse中运行的java程序)编辑当前使用的J ...

  5. 【totti】sun和IBM虚拟机堆大小设置分析

    在IBM的虚拟机官方指导文档中明确指出,禁止将虚拟机的最大值和最小值设置为相等,否则会导致以下2个后果 <1>极大的增加垃圾回收时间,影响系统性能 <2>造成系统中存在内存碎片 ...

  6. java 设置年轻代堆大小,[JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配...

    [JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配 [JVM学习之路]五.堆(一)堆的内存结构.参数设置.分代思想.内存分配策略及TLAB 一.堆的核心概述 堆的特点: 1.一个jvm实 ...

  7. java 堆大小的最大值_优化Java堆大小的5个技巧

    优化Java堆大小的5个技巧 摘要:Java堆容量不足可以对性能造成很大影响,这样无疑就给程序带来不可必要的麻烦,本文总结了影响Java堆容量不足的五大原因以及巧妙地去优化? 本文作者Pierre是一 ...

  8. linux脚本制定java堆大小_Java使用比堆大小更多的内存(或正确的Docker内存限制大小)...

    Java使用比堆大小更多的内存(或正确的Docker内存限制大小) 对于我的应用程序,Java进程使用的内存远远超过堆大小. 容器正在运行的系统开始出现内存问题,因为容器占用的内存比堆大小多得多. 堆 ...

  9. outlook附加文件超过服务器允许大小,如何在Outlook中更改或增加附件大小限制?...

    如何在Outlook中更改附件大小限制? 有时,我无法在Outlook中成功插入大附件,但是出现警告对话框,提示附件大小超出了允许的限制. 请参阅以下屏幕截图. 发生此错误是由于超出了Outlook中 ...

最新文章

  1. java 二进制模块_深入Node模块Buffer-学会操作二进制
  2. Java编程笔试时输入问题:如何输入固定长度、不定长度的一维数组?如何输入固定长度、不定长度的二维数组?
  3. windows下python脚本程序的运行
  4. PAT甲级——1102 Invert a Binary Tree (层序遍历+中序遍历)
  5. web学习2--理解MVC及快速入门
  6. mysql+秘密_mysql不被人知的秘密
  7. MATLAB的GUI设置为不能点击状态(将按钮变为灰色)
  8. 文件系统(01):基于SpringBoot框架,管理Excel和PDF文件类型
  9. ISAKMP:(1006):deleting node 1202729771 error TRUE reason Delete Larval
  10. html表格怎么设置浮动,html – 表格布局和浮动左和引导网格
  11. 系统集成项目管理视频课程
  12. 游戏巨头齐聚 Unite Shanghai 2019,揭秘爆款游戏制作精彩亮点!
  13. pyecharts制作中国疫情地图
  14. STL(标准模板库)
  15. 《春秋·战国》大事年表
  16. ## 关于时下新兴的日常图片视频摄像防抖技术的简单介绍与讨论
  17. Axure制作幻灯片轮播案例
  18. BZOJ 3729: Gty的游戏
  19. 手机测试属于硬件测试还是软件测试6,红米手机的硬件测试的2种基本操作
  20. 253:丛林中的路——最小生成树Prim

热门文章

  1. BigDecimal类的使用
  2. 用python进行自然语言处理_Python自然语言处理示例:SVM和贝叶斯分类
  3. synchronized原理_Java并发编程 -- synchronized保证线程安全的原理
  4. inner join on 加条件和where加条件_SQL学习笔记 - GROUP BY / JOIN / UNION
  5. 转-Apache kafka 工作原理介绍
  6. 机器学习(周志华)- 第2章模型评估与选择笔记
  7. JDK8的日期时间类2
  8. vue中生产模式和调试模式_为什么在生产中进行调试是如此诱人?
  9. javafx 打印控件_Java的新视差控件(JavaFX)
  10. js 实现轻量ps_简单轻量的池实现