传说古代有一只四角四足的怪兽:名叫。因冬天大雪导致夕没东西吃,所以夕经常到附近的村里找吃的,因其身体庞大、脾气暴躁、凶猛异常,给村民带来了很大的灾难。

后来有一位聪明的孩子,他叫做,教给大家除掉“夕”的方法:用爆竹,轻则赶走它,重则伤它。每年腊月三十,夕都会来村里,村名就守着夜,放着鞭炮赶走夕。除夕由此而来。

我们把“夕”想象成一个不断吃机器内存的 Java 程序,就称它为 年兽吧。掌管 Java 虚拟机内存的就是“年”,我们称它为年哥吧。

年哥的地盘

年哥管理的地盘主要分为五大区:堆、方法区、虚拟机栈、本地方法栈、程序计数器。大家可以把图上的线程想象成村民,而堆是作为村民共享使用的区域。

如下图所示:

堆又可以进行细分,分为新生代老年代,新生代和老年代的比例是 1:2,而新生代又可以进行细分,分为伊甸园(Eden)区和两个 Survivor, 其中 Eden 区大小和 Survivor 区大小是 8:1。

如下图所示,年兽和村民都是共享堆内存这块地盘的,管理员年哥是管理堆内存的。其中的数字 1、8、20 分别代表占用内存的份数。

年兽的胃口

年兽的胃口是村民的几百倍,年兽假扮村名逃过了管理员年哥的检查,年哥对于这种大胃王都是直接分配到老年代去的,因为大胃王需要连续的内存给它吃,而新生代的碎片比较多不满足条件。在 Java 的世界中,最典型的大胃王就是大对象:如很长的字符串,或者元素数量很庞大的数组。

如下图所示,村民分配到新生代吃内存,年兽被直接分配到老年代。

大量年兽入侵

年兽尝到甜头后,就开始不断地呼叫它的亲戚朋友,大量年兽被分配到了老年代,直接导致老年代的内存空间不足了,如下图所示:

代码演示

我们用代码来演示下年兽入侵:

  • 创建了 3 个年兽,都占用 10 MB 内存。
public class SpringFestivalOOM {public static void main(String[] args) {// 年兽1/2/3,都占用 10 MB 内存byte[] nianShou1 = new byte[10 * 1024 * 1024];byte[] nianShou2 = new byte[10 * 1024 * 1024];byte[] nianShou3 = new byte[10 * 1024 * 1024];}
}
  • 编译这段程序。
javac SpringFestivalOOM.java
  • 执行这段程序,同时设置堆内存最大为 20 MB。
java -Xms20M -Xmx20M SpringFestivalOOM

因为 3 个年兽占用的内存 30 MB 大于堆的最大内存 20 MB,所以抛出堆内存溢出异常,如下图所示:

这个时候年哥和村民才发现,原来有这么多年兽占了我们的地盘,赶快消灭它们!

打走年兽

村民们和年哥凑到一块,讨论了下该如何解决这个问题,究其原因就是年兽太多了,要减少他们呼朋唤友来吃内存。

放到我们的 Java 世界中,就是减少大对象的频繁创建

我们程序员经常出现本地写完代码后没什么问题,到线上后就出问题,很可能的原因就是线上环境的数据量大,很容易出现大对象的频繁创建,比如大型促销活动时,短时间内需要创建大量订单数据,而订单数据又比较复杂,有很多字段,可能会占用大量的内存空间,最终导致频繁触发垃圾回收,而垃圾回收时间又会出现 Stop the world 现象,应用程序的性能就降下来了。

守岁

在除夕晚上,都会进行“守岁”,村民们齐聚一堂吃着年夜饭,一起等待除夕的钟声。等到天亮再拜访亲戚邻居。

而守岁这个过程只能待在家里,不能做其他事情,所以可以看成是垃圾回收时,其他线程不能工作,也就是 Stop the world 的由来。

如下图所示,除夕之前,村民可以去其他地方活动,除夕夜就只能待在家里守岁了,到了第二天早上就可以串门拜年了。

总结

本篇通过除夕的故事来讲解 Java 中垃圾回收机制,因故事较为简单,所以并没有对垃圾回收算法进行深入讲解,本篇只能算作垃圾回收的入门,希望能给大家带来一定启发作用,对 JVM 很熟的同学就当学习下除夕的来历吧~

  • 村民作为小对象使用堆区的新生代,年兽作为大对象直接使用堆区的老年代
  • 除夕当晚,大量年兽入侵老年代,导致堆区内存不足,触发垃圾回收机制。
  • 守岁就是待在家里守着过新年,而垃圾回收时,又会停止其他线程,也就是 Stop the world。
  • 避免代码中频繁复制或创建大对象是必须做的事情,以免上线后出现问题。
  • 除夕也代表着辞旧迎新,这不正是执行垃圾回收吗?

悟空在这里预估大家除夕快乐,新年快乐,2021 心想事成,好事成双~

为什么要“除夕”,原来是内存爆了!相关推荐

  1. mysql内存爆_线上MySQL机器内存爆掉原因分析与解决

    现象: 阿里金融某业务的MySQL机器的内存每隔几天就会增长,涨上去后,却不下来.累积后内存爆掉. 分析: 此业务是间隔的对MySQL有大访问,其它时间几乎无访问.排查发现,内存涨时,一般会有MySQ ...

  2. mysql爆内存_线上MySQL数据库机器内存爆掉原因分析与解决

    本文主要向大家介绍了线上MySQL数据库机器内存爆掉原因分析与解决,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 现象: 阿里金融某业务的MySQL机器的内存每隔几天就会增长,涨 ...

  3. pytorch运行过程中死机(内存爆掉或者内存正常)

    linux18.04下,在运行pytorch程序的过程中,电脑直接卡死死机,鼠标和键盘都没有反应,只能强制关机. 安装htop观察内存和cpu的使用情况,内存32G,CPU是i7-8700. 程序在之 ...

  4. python 读取数据库内存爆_解决python读取几千万行的大表内存问题

    Python导数据的时候,需要在一个大表上读取很大的结果集. 如果用传统的方法,Python的内存会爆掉,传统的读取方式默认在内存里缓存下所有行然后再处理,内存容易溢出 解决的方法: 1)使用SSCu ...

  5. linux 内存爆浆,内存条为什么会引起花屏

    内存条为什么会引起花屏 首先,可能是电脑显卡驱动有问题,先卸载目前的显卡驱动,从网上下载最新版本的显卡驱动程序,安装后在运行游戏时电脑依然有固定的区域出现花屏的问题. 再次,将电脑的机箱打开,把显卡拆 ...

  6. 解决SDWebimage加载过多过大图片导致内存爆表崩溃的问题

    问题: Restore the connection to "xxxx" and run "xx" again, or if "xx" is ...

  7. linux内存爆了会怎样,linux系统中内存爆满之后会如何?

    在使用python写程序的时候,发现一个可以无限迭代的迭代器,从而可以直接将系统中的内存占满,那么占满之后会发生什么呢? 1. 创建无限迭代,生成列表,如下: [root@python ~]# pyt ...

  8. 关于 PM2 Daemon 进程,内存爆涨的问题分析及解决

    PM2 Daemon 进程内存占用持续上涨,很大原因可能不是本身的原因,大概率是使用PM2启动启动的服务内存存在问题,而导致PM2 Daemon 进程内存持续上涨. 解决问题的思路:解决 Node 中 ...

  9. 虚拟环境内使用pip安装torch内存爆掉

    目录 问题描述与解决方案 问题描述 解决方案 确定与电脑相配的cuda版本 寻找对应的`.whl`文件 打开网站 下载完成后进入虚拟环境 问题描述与解决方案 问题描述 在anaconda的虚拟环境内安 ...

最新文章

  1. 边界框的回归策略搞不懂?算法太多分不清?看这篇就够了
  2. python如何爬虫-如何入门 Python 爬虫?
  3. 转载--编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议60~64)
  4. slor6.6 在linux下的安装以及启动失败解决办法
  5. 离职那天!同龄的CTO悄悄私信我,他的年薪是我的10倍
  6. js中select下拉框重置_Web测试中需要注意的16个小细节
  7. css中的单位换算_CSS单位px、em、rem及它们之间的换算关系
  8. git 常用命令备查
  9. 关于 win7 远程桌面的多用户问题
  10. JS中的基本数据类型与引用数据类型
  11. 动态删除列表中的元素
  12. HDU4183 Pahom on Water(来回走最大流,一个点只经过一次)
  13. 异常:Software caused connection abort: socket write error
  14. 兄弟打印机内存已满清零方法_兄弟打印机清零大全
  15. Games101学习笔记二(锯齿、模糊等失真的本质)
  16. 遇到的问题--docker---gitlab---k8s---error pulling image configuration: Get https://production.cloudflare.
  17. 百度网盘解析加速网页版[演示站可用]
  18. Leetcode_206_Reverse Linked List
  19. 第五章 彩色图像处理
  20. ,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microso ft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies

热门文章

  1. 37种传感器(十九)之红外避障模块+Stduino NanoUNO
  2. 虚拟盘rpc服务器不可用,rpc服务器不可用,手把手教你rpc服务器不可用怎么办
  3. Android 终端推流-采集
  4. R语言基础——数据框(data frame)
  5. 淘宝侧边栏下滑页面固定案例
  6. numpy生成等差等比数列
  7. 智慧物流:RFID智能仓储管理解决方案-新导智能
  8. 郝斌数据结构全套教程高清在线观看和下载-学习数据结构必看
  9. studio中 Connection reset
  10. 【STM32H7的DSP教程】第38章 STM32H7的FIR高通滤波器实现(支持逐个数据的实时滤波)