当前位置:网站首页>为什么要“除夕”,原来是内存爆了!
为什么要“除夕”,原来是内存爆了!
2022-06-25 06:38:00 【悟空聊架构】
“传说古代有一只四角四足的怪兽:名叫
夕。因冬天大雪导致夕没东西吃,所以夕经常到附近的村里找吃的,因其身体庞大、脾气暴躁、凶猛异常,给村民带来了很大的灾难。后来有一位聪明的孩子,他叫做
”年,教给大家除掉“夕”的方法:用爆竹,轻则赶走它,重则伤它。每年腊月三十,夕都会来村里,村名就守着夜,放着鞭炮赶走夕。除夕由此而来。
我们把“夕”想象成一个不断吃机器内存的 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。
避免代码中 频繁复制或创建大对象是必须做的事情,以免上线后出现问题。
除夕也代表着辞旧迎新,这不正是执行垃圾回收吗?
作者简介:8 年互联网经验,擅长架构设计、分布式、微服务。手写了一套 SpringCloud 实战教程,自主开发了 PMP 刷题小程序和 Java 刷题小程序。回复 pdf 领取。

“悟空在这里预估大家除夕快乐,新年快乐,2021 心想事成,好事成双~
”
本文分享自微信公众号 - 悟空聊架构(PassJava666)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
边栏推荐
- Chang Wei (variables and constants) is easy to understand
- MySQL(十二)——更改表的备注
- Drawing shp files using OpenGL
- Conditional grouping with $exists inside $cond
- [Shangshui Shuo series] day 5
- ES 终于可以搜到”悟空哥“了!
- TEMPEST HDMI泄漏接收 2
- MySQL - definition and assignment of variables
- In depth analysis of Apache bookkeeper series: Part 3 - reading principle
- LabVIEW jump to web page
猜你喜欢

5g private network market is in full swing, and it is crucial to solve deployment difficulties in 2022

Enter an integer with any number of bits, and output the sum of each bit of the number. For example: 1234 – > 10

TEMPEST HDMI泄漏接收 1

Americo technology launches professional desktop video editing solution

Finally, when you open source the applet ~

1W words | 40 pictures | hard core es actual combat

Several schemes of traffic exposure in kubernetes cluster
![[Introduction aux uvm== > Episode 9] ~ modèle de registre, intégration du modèle de registre, méthode conventionnelle du modèle de registre, scénario d'application du modèle de registre](/img/c0/b373a3f0e0c7b35f42c8a28b4d4f74.png)
[Introduction aux uvm== > Episode 9] ~ modèle de registre, intégration du modèle de registre, méthode conventionnelle du modèle de registre, scénario d'application du modèle de registre

The e-book "action guide for large organizations to further promote zero code application platform" was officially released!
![Analysis on the trend of the number of national cinemas, film viewers and average ticket prices in 2021 [figure]](/img/01/594990789cbc1817dbbf61b7dd0c4c.jpg)
Analysis on the trend of the number of national cinemas, film viewers and average ticket prices in 2021 [figure]
随机推荐
Can we use function pointers in go- Can we have function pointers in Go?
Common cluster scripts
What is the new business model of Taishan crowdfunding in 2022?
レ / leilei
[Shangshui Shuo series] day 4
Event registration | Apache pulsar x kubesphere online meetup is coming
Debug through yalc before releasing NPM package
5g private network market is in full swing, and it is crucial to solve deployment difficulties in 2022
Change the current count of auto increment values in MySQL- Changing the current count of an Auto Increment value in MySQL?
Want to self-study SCM, do you have any books and boards worth recommending?
Blue Bridge Cup SCM module code (matrix key) (code + comments)
[C language] one dimensional array
MySQL - definition and assignment of variables
Using awk to process input from multiple files
威迈斯新能源冲刺科创板:年营收17亿 应收账款账面价值近4亿
[ros2] Why use ros2? Introduction to ros2 system characteristics
Analysis on the trend of the number of national cinemas, film viewers and average ticket prices in 2021 [figure]
【一起上水硕系列】Day 5
Kubernetes 集群中流量暴露的几种方案
Streamnational platform version 1.5 is released, integrating istio and supporting openshift deployment