成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么要“除夕”,原來是內存爆了!

存儲 存儲軟件
傳說古代有一只四角四足的怪獸:名叫夕。因冬天大雪導致夕沒東西吃,所以夕經常到附近的村里找吃的,因其身體龐大、脾氣暴躁、兇猛異常,給村民帶來了很大的災難。

[[381658]]

傳說古代有一只四角四足的怪獸:名叫夕。因冬天大雪導致夕沒東西吃,所以夕經常到附近的村里找吃的,因其身體龐大、脾氣暴躁、兇猛異常,給村民帶來了很大的災難。

后來有一位聰明的孩子,他叫做年,教給大家除掉“夕”的方法:用爆竹,輕則趕走它,重則傷它。每年臘月三十,夕都會來村里,村名就守著夜,放著鞭炮趕走夕。除夕由此而來。

”我們把“夕”想象成一個不斷吃機器內存的 Java 程序,就稱它為 年獸吧。掌管 Java 虛擬機內存的就是“年”,我們稱它為年哥吧。

年獸的地盤

年哥管理的地盤主要分為五大區:堆、方法區、虛擬機棧、本地方法棧、程序計數器。如下圖所示。另外大家可以把圖中的線程想象成村民,而堆是作為村民共享使用的區域。

運行時數據區

 

堆又可以進行細分,分為新生代和老年代,新生代和老年代的比例是 1:2,而新生代又可以進行細分,分為伊甸園(Eden)區和兩個 Survivor, 其中 Eden 區大小和Survivor 區大小是 8:1。

如下圖所示,年獸和村民都是共享堆內存這塊地盤的,管理員年哥是管理堆內存的。其中的數字 1、8、20 分別代表占用內存的份數。

共享堆區

 

年獸的胃口

年獸的胃口是村民的幾百倍,年獸假扮村民逃過了管理員年哥的檢查,年哥對于這種大胃王都是直接分配到老年代去的,因為大胃王需要連續的內存給它吃,而新生代的碎片比較多不滿足條件。在 Java 的世界中,最典型的大胃王就是大對象:如很長的字符串,或者元素數量很龐大的數組。

如下圖所示,村民分配到新生代吃內存,年獸被直接分配到老年代。

年獸被直接分配到老年代

 

大量年獸入侵

年獸嘗到甜頭后,就開始不斷地呼叫它的親戚朋友,大量年獸被分配到了老年代,直接導致老年代的內存空間不足了,如下圖所示:

大量年獸入侵

 

代碼演示

我們用代碼來演示下年獸入侵:

  • 創建了 3 個年獸,都占用 10 MB 內存。
  1. public class SpringFestivalOOM { 
  2.     public static void main(String[] args) { 
  3.         // 年獸1/2/3,都占用 10 MB 內存 
  4.         byte[] nianShou1 = new byte[10 * 1024 * 1024]; 
  5.         byte[] nianShou2 = new byte[10 * 1024 * 1024]; 
  6.         byte[] nianShou3 = new byte[10 * 1024 * 1024]; 
  7.     } 
  • 編譯這段程序。
  1. javac SpringFestivalOOM.java 
  • 執行這段程序,同時設置堆內存最大為 20 MB。
  1. java -Xms20M -Xmx20M SpringFestivalOOM 

因為 3 個年獸占用的內存 30 MB 大于堆的最大內存 20 MB,所以拋出堆內存溢出異常,如下圖所示:

堆內存溢出異常

 

這個時候年哥和村民才發現,原來有這么多年獸占了我們的地盤,趕快消滅它們!

打走年獸

村民們和年哥湊到一塊,討論了下該如何解決這個問題,究其原因就是年獸太多了,要減少他們呼朋喚友來吃內存。

放到我們的 Java 世界中,就是減少大對象的頻繁創建。

我們程序員經常出現本地寫完代碼后沒什么問題,到線上后就出問題,很可能的原因就是線上環境的數據量大,很容易出現大對象的頻繁創建,比如大型促銷活動時,短時間內需要創建大量訂單數據,而訂單數據又比較復雜,有很多字段,可能會占用大量的內存空間,最終導致頻繁觸發垃圾回收,而垃圾回收時又會出現 Stop the world 現象,應用程序的性能就降下來了。

守歲

在除夕晚上,都會進行“守歲”,村民們齊聚一堂吃著年夜飯,一起等待除夕的鐘聲。等到天亮再拜訪親戚鄰居。

而守歲這個過程只能待在家里,不能做其他事情,所以可以看成是垃圾回收時,其他線程不能工作,也就是 Stop the world 的由來。

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

守歲

 

總結

本篇通過除夕的故事來講解 Java 中垃圾回收機制,因故事較為簡單,所以并沒有對垃圾回收算法進行深入講解,本篇只能算作垃圾回收的入門,希望能給大家帶來一定啟發作用,對 JVM 很熟的同學就當學習下除夕的來歷吧~

  • 村民作為小對象使用堆區的新生代,年獸作為大對象直接使用堆區的老年代。
  • 除夕當晚,大量年獸入侵老年代,導致堆區內存不足,觸發垃圾回收機制。
  • 守歲就是待在家里守著過新年,而垃圾回收時,又會停止其他線程,也就是 Stop the world。
  • 避免代碼中頻繁復制或創建大對象是必須做的事情,以免上線后出現問題。
  • 除夕也代表著辭舊迎新,這不正是執行垃圾回收嗎?

本文轉載自微信公眾號「悟空聊架構」,可以通過以下二維碼關注。轉載本文請聯系悟空聊架構公眾號。

 

 

責任編輯:武曉燕 來源: 悟空聊架構
相關推薦

2019-08-30 10:27:37

數據庫通信技術

2025-02-17 09:22:16

MySQLSQL語句

2021-02-02 09:13:11

索引SQL數據庫

2021-11-29 18:34:14

內存異步死循環

2025-04-03 10:39:56

2019-11-28 14:14:16

微信QQ騰訊

2017-06-06 15:13:07

2022-12-14 07:32:40

InnoDBMySQL引擎

2021-02-07 08:13:18

@DateTimeFo@NumberFormSpring

2020-03-23 08:30:12

程序員男友感受

2022-01-09 23:44:14

5G4G手機

2017-11-02 21:17:35

數字化

2009-03-10 12:42:45

2022-07-13 10:37:59

服務器故障優化

2018-01-31 14:50:04

LinuxmacOS .bashrc

2025-04-10 08:00:00

服務限流開發高并發

2018-04-02 15:13:21

網絡

2017-11-12 21:12:34

HPC

2023-02-15 08:17:38

2024-04-30 08:22:51

Figma圖形編輯變換矩陣
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美性视频在线播放 | 性在线 | 午夜男人的天堂 | 97超在线视频 | 久久久国产一区二区三区 | 精品一区二区免费视频 | 久久久久高清 | 国产精品成人一区 | 一区二区国产精品 | 精品在线免费观看视频 | 日韩中文视频 | 欧美激情va永久在线播放 | 久久久久九九九九 | 亚洲精品1 | 免费看一级毛片 | 一区二区国产精品 | 97免费在线视频 | 欧美日韩久久 | 亚洲成人在线免费 | 欧美日本在线观看 | 日韩一区二区三区在线观看 | 欧美国产大片 | 中文字幕一区二区三区在线观看 | 欧美综合视频 | 91精品国产91久久久久久吃药 | av中文天堂 | 黄色免费在线观看 | 亚洲天堂中文字幕 | 一区二区日韩 | 欧美一区二区三区在线视频 | 成人在线视频网站 | 国产精品不卡视频 | 国产成人免费在线 | 欧美色综合一区二区三区 | 四虎成人精品永久免费av九九 | 一级黄色录像片子 | 天堂色网 | 亚洲 91| 亚洲精品免费视频 | 国产精品a久久久久 | 粉嫩一区二区三区性色av |