<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          為何內(nèi)存不夠用?微服務(wù)改造啟動(dòng)多個(gè) SpringBoot 的陷阱與解決方案

          共 3255字,需瀏覽 7分鐘

           ·

          2024-06-22 13:49

          程序員的成長(zhǎng)之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享 
          關(guān)注


          閱讀本文大概需要 2.8 分鐘。

          來自:juejin.cn/post/7303862023618707491

          推薦一個(gè)我自己寫的Chrome插件:
          https://briefurl.top/csdn

          免登錄一鍵復(fù)制代碼,支持選中代碼,自動(dòng)展開 CSDN 全文,去除煩人的登錄彈窗。

          這是轉(zhuǎn)換的短鏈,會(huì)轉(zhuǎn)到google插件商店去,訪問需要梯子哈。

          以下是正文。



          在生產(chǎn)環(huán)境中我們會(huì)遇到一些問題,此文主要記錄并復(fù)盤一下當(dāng)時(shí)項(xiàng)目中的實(shí)際問題及解決過程。

          背景簡(jiǎn)述

          最初系統(tǒng)上線后都比較正常風(fēng)平浪靜的。在系統(tǒng)運(yùn)行了一段時(shí)間后,業(yè)務(wù)量上升后,生產(chǎn)上發(fā)現(xiàn)java應(yīng)用內(nèi)存占用過高,服務(wù)器總共64G,發(fā)現(xiàn)每個(gè)SpringBoot占用近12G的內(nèi)存,我們項(xiàng)目采用微服務(wù)架構(gòu),有多個(gè)springboot應(yīng)用。一下子內(nèi)存就不夠用了,springboot出現(xiàn)假死了。
          由于當(dāng)時(shí)生產(chǎn)沒有截圖,我用本機(jī)模擬類似的情況。

          可以看到內(nèi)存基本被使用完了,為什么Java程序會(huì)占用這么大內(nèi)存呢?

          解決步驟

          step1:jps查看進(jìn)程ID或通過top
          step2:jmap -heap 進(jìn)程ID
          可以看到Java應(yīng)用的最大堆內(nèi)存是4G,當(dāng)時(shí)我們生產(chǎn)是64G的物理內(nèi)存,生產(chǎn)Java應(yīng)用的最大堆內(nèi)存是12G。
          • 最大堆大小(-Xmx):通常為物理內(nèi)存的1/4。
          • 初始堆大小(-Xms):通常為物理內(nèi)存的1/64。
          以下是Oracle官方對(duì)JVM默認(rèn)參數(shù)的詳細(xì)說明:
          以下是對(duì)應(yīng)的譯文:

          默認(rèn)堆大小

          除非在命令行中指定了初始堆大小和最大堆大小,否則它們是根據(jù)計(jì)算機(jī)上的內(nèi)存量計(jì)算的。
          客戶端 JVM 默認(rèn)初始和最大堆大小
          默認(rèn)最大堆大小是物理內(nèi)存的一半(物理內(nèi)存大小不超過 192 兆字節(jié) (MB)),否則為物理內(nèi)存的四分之一(物理內(nèi)存大小不超過 1 千兆字節(jié) (GB))。
          例如,如果您的計(jì)算機(jī)有 128 MB 物理內(nèi)存,則最大堆大小為 64 MB,大于或等于 1 GB 物理內(nèi)存會(huì)導(dǎo)致最大堆大小為 256 MB。
          JVM 實(shí)際上不會(huì)使用最大堆大小,除非您的程序創(chuàng)建了足夠的對(duì)象來需要它。在 JVM 初始化期間分配的量要小得多,稱為初始堆大小。此量至少為 8 MB,否則為物理內(nèi)存的 1/64,最大物理內(nèi)存大小為 1 GB。
          分配給年輕代的最大空間量是總堆大小的三分之一。
          服務(wù)器 JVM 默認(rèn)初始和最大堆大小
          默認(rèn)初始堆大小和最大堆大小在服務(wù)器 JVM 上的工作方式與在客戶端 JVM 上的工作方式類似,只是默認(rèn)值可以更高。在 32 位 JVM 上,如果有 4 GB 或更多物理內(nèi)存,則默認(rèn)最大堆大小可達(dá) 1 GB。在 64 位 JVM 上,如果有 128 GB 或更多物理內(nèi)存,則默認(rèn)最大堆大小可達(dá) 32 GB。
          到這里基本上可以看出是運(yùn)維人員發(fā)布Java應(yīng)用時(shí)并沒有設(shè)置JVM參數(shù),而是使用默認(rèn)JVM參數(shù)。導(dǎo)致每個(gè)Java應(yīng)用占用過高。雖然是小問題,但生產(chǎn)上每個(gè)Java占用12G內(nèi)存還是比較嚇人的。

          復(fù)盤

          一般內(nèi)存占用過大的排查思路:
          在排查內(nèi)存占用過大的問題時(shí),一般可以采取以下思路:
          • 檢查JVM參數(shù): 如果在生產(chǎn)環(huán)境中啟動(dòng)Spring Boot沒有設(shè)置JVM參數(shù),使用默認(rèn)的JVM配置,可能會(huì)導(dǎo)致性能問題和資源浪費(fèi)。優(yōu)化JVM參數(shù),根據(jù)應(yīng)用程序的需求和服務(wù)器配置進(jìn)行調(diào)整。
          • 觀察內(nèi)存使用情況:  使用監(jiān)控工具或者操作系統(tǒng)提供的工具,觀察Java應(yīng)用的內(nèi)存使用情況,包括堆內(nèi)存、非堆內(nèi)存、垃圾回收等。
          • 分析GC: 如果發(fā)現(xiàn)內(nèi)存問題,可以分析GC日志以了解垃圾回收的情況,包括頻率、時(shí)間等。
          • 合理設(shè)置堆內(nèi)存大小: 根據(jù)應(yīng)用程序的需求和服務(wù)器的物理內(nèi)存,合理設(shè)置堆內(nèi)存的大小,避免過大或過小導(dǎo)致性能問題。
          • 考慮使用內(nèi)存分析工具: 使用工具如VisualVM、MAT等,對(duì)應(yīng)用程序進(jìn)行內(nèi)存分析,找出可能存在的內(nèi)存泄漏或者大對(duì)象。
          如果在生產(chǎn)環(huán)境中啟動(dòng)springboot沒有設(shè)置jvm參數(shù),使用默認(rèn)的JVM配置,可能會(huì)有以下幾個(gè)危害:
          • 默認(rèn)的JVM配置可能不適合你的應(yīng)用程序的性能需求和資源限制,導(dǎo)致內(nèi)存溢出、垃圾回收頻繁、性能下降等問題。

          • 默認(rèn)的JVM配置可能會(huì)浪費(fèi)服務(wù)器的內(nèi)存資源,因?yàn)镴VM會(huì)根據(jù)物理內(nèi)存的大小來分配堆內(nèi)存的大小,而不是根據(jù)應(yīng)用程序的實(shí)際需求。

          因此,建議在生產(chǎn)環(huán)境中啟動(dòng)springboot時(shí),根據(jù)應(yīng)用程序的特點(diǎn)和服務(wù)器的配置,合理地設(shè)置JVM參數(shù),以提高應(yīng)用程序的性能和穩(wěn)定性,節(jié)省服務(wù)器的資源。
          <END>

          推薦閱讀:

          為什么 "??????".length !== 3 ?

          減少 try catch ,可以這樣干!

              
          程序員在線工具站:cxytools.com

          推薦一個(gè)我自己寫的工具站:http://cxytools.com,專為程序員設(shè)計(jì),包括時(shí)間日期、JSON處理、SQL格式化、隨機(jī)字符串生成、UUID生成、隨機(jī)數(shù)生成、文本Hash...等功能,提升開發(fā)效率。

          ?戳閱讀原文直達(dá)!                                  朕已閱 

          瀏覽 32
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  三区在线观看 | 久久婷婷亚洲AV无码专区 | 7777偷窥盗摄视频 | 成人AV麻豆系列 | 国产一级AV国产免费 |