為何內存不夠用?微服務改造啟動多個Spring Boot的陷阱與解決方案

在生產環境中我們會遇到一些問題,此文主要記錄并復盤一下當時項目中的實際問題及解決過程。

背景簡述

最初系統上線后都比較正常風平浪靜的。在系統運行了一段時間后,業務量上升后,生產上發現java應用內存占用過高,服務器總共64G,發現每個SpringBoot占用近12G的內存,我們項目采用微服務架構,有多個springboot應用。一下子內存就不夠用了,springboot出現假死了。

由于當時生產沒有截圖,我用本機模擬類似的情況。

可以看到內存基本被使用完了,為什么Java程序會占用這么大內存呢?

解決步驟

step1:jps查看進程ID或通過top

step2:jmap -heap 進程ID

可以看到Java應用的最大堆內存是4G,當時我們生產是64G的物理內存,生產Java應用的最大堆內存是12G。

  • 最大堆大小(-Xmx):通常為物理內存的1/4。
  • 初始堆大小(-Xms):通常為物理內存的1/64。

以下是Oracle官方對JVM默認參數的詳細說明:

以下是對應的譯文:

默認堆大小

除非在命令行中指定了初始堆大小和最大堆大小,否則它們是根據計算機上的內存量計算的。

客戶端 JVM 默認初始和最大堆大小

默認最大堆大小是物理內存的一半(物理內存大小不超過 192 兆字節 (MB)),否則為物理內存的四分之一(物理內存大小不超過 1 千兆字節 (GB))。

例如,如果您的計算機有 128 MB 物理內存,則最大堆大小為 64 MB,大于或等于 1 GB 物理內存會導致最大堆大小為 256 MB。

JVM 實際上不會使用最大堆大小,除非您的程序創建了足夠的對象來需要它。在 JVM 初始化期間分配的量要小得多,稱為初始堆大小。此量至少為 8 MB,否則為物理內存的 1/64,最大物理內存大小為 1 GB。

分配給年輕代的最大空間量是總堆大小的三分之一。

服務器 JVM 默認初始和最大堆大小

默認初始堆大小和最大堆大小在服務器 JVM 上的工作方式與在客戶端 JVM 上的工作方式類似,只是默認值可以更高。在 32 位 JVM 上,如果有 4 GB 或更多物理內存,則默認最大堆大小可達 1 GB。在 64 位 JVM 上,如果有 128 GB 或更多物理內存,則默認最大堆大小可達 32 GB。

到這里基本上可以看出是運維人員發布Java應用時并沒有設置JVM參數,而是使用默認JVM參數。導致每個Java應用占用過高。雖然是小問題,但生產上每個Java占用12G內存還是比較嚇人的。

復盤

一般內存占用過大的排查思路:

在排查內存占用過大的問題時,一般可以采取以下思路:

  1. 檢查JVM參數: 如果在生產環境中啟動Spring Boot沒有設置JVM參數,使用默認的JVM配置,可能會導致性能問題和資源浪費。優化JVM參數,根據應用程序的需求和服務器配置進行調整。
  2. 觀察內存使用情況: 使用監控工具或者操作系統提供的工具,觀察Java應用的內存使用情況,包括堆內存、非堆內存、垃圾回收等。
  3. 分析GC: 如果發現內存問題,可以分析GC日志以了解垃圾回收的情況,包括頻率、時間等。
  4. 合理設置堆內存大小: 根據應用程序的需求和服務器的物理內存,合理設置堆內存的大小,避免過大或過小導致性能問題。
  5. 考慮使用內存分析工具: 使用工具如VisualVM、MAT等,對應用程序進行內存分析,找出可能存在的內存泄漏或者大對象。

如果在生產環境中啟動springboot沒有設置jvm參數,使用默認的JVM配置,可能會有以下幾個危害:

  • 默認的JVM配置可能不適合你的應用程序的性能需求和資源限制,導致內存溢出、垃圾回收頻繁、性能下降等問題。
  • 默認的JVM配置可能會浪費服務器的內存資源,因為JVM會根據物理內存的大小來分配堆內存的大小,而不是根據應用程序的實際需求。

因此,建議在生產環境中啟動springboot時,根據應用程序的特點和服務器的配置,合理地設置JVM參數,以提高應用程序的性能和穩定性,節省服務器的資源。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161559.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161559.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161559.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

打印出一個底部有n個*的漏斗c語言

題目描述 打印出一個底部有n個*的漏斗 輸入 第一行輸入一個T;表示有T組測試數據 下面每一行都有一個n表示漏斗底部*的個數 n保證是奇數 輸出 輸出打印結果 兩個測試答案之間要用換行分割 /*printf("這是第%d行 我要打印%d個* \n",Num,i); */ *********** *…

愛創科技總裁謝朝暉榮獲“推動醫藥健康產業高質量發展人物”

中國醫藥市場規模已經成為全球第二大醫藥市場,僅次于美國。近年來,隨著中國經濟的持續增長和人民生活水平的提高,醫藥市場需求不斷擴大。政府對醫療衛生事業的投入也在不斷加大,為醫藥行業的發展創造了良好的政策環境。為推動醫藥…

SparkSession介紹

一、 介紹 SparkSession是Spark 2.0中引入的新概念,它是Spark SQL、DataFrame和Dataset API的入口點,是Spark編程的統一API,也可看作是讀取數據的統一入口;它將以前的SparkContext、SQLContext和HiveContext組合在一起&#xff0…

結構體與指針_sizeof_static_extern_函數指針數組_函數指針_回調函數

一、結構體與指針 #include <stdint.h> #include <stdlib.h> #include <stdio.h> #define up_to_down(uuu) (downdemo_t *)(uuu->beg) #define __plc__ typedef struct updemo_s{uint8_t *head;uint8_t *beg;uint8_t *end; }updemo_t; typedef struct do…

陪玩圈子系統APP小程序H5,詳細介紹,源碼交付,支持二開!

陪玩圈子系統&#xff0c;頁面展示&#xff0c;源碼交付&#xff0c;支持二開&#xff01; 陪玩后端下載地址&#xff1a;電競開黑陪玩系統小程序&#xff0c;APP&#xff0c;H5: 本系統是集齊開黑&#xff0c;陪玩&#xff0c;陪聊于一體的專業APP&#xff0c;小程序&#xff…

2:kotlin集合(Collections)

集合有助于數據分組&#xff0c;方便后續操作 集合類型說明Lists有序的可重復的集合Sets無序的不可重復的集合Maps鍵值對映射集合&#xff0c;鍵唯一&#xff0c;且一個鍵只能映射到一個值 每個集合類型都可以是可變的或者只讀的 List List按照添加的順序存儲內容&#xff…

Linux進程通信——共享內存

概念 共享內存&#xff08;Shared Memory&#xff09;&#xff0c;指兩個或多個進程共享一個給定的存儲區。 特點 共享內存是最快的一種 IPC&#xff0c;因為進程是直接對內存進行存取。 因為多個進程可以同時操作&#xff0c;所以需要進行同步。 信號量共享內存通常結合在一…

Open3D (C++) 計算兩點云之間的最小距離

目錄 一、 算法原理二、代碼實現三、結果展示本文由CSDN點云俠原創,原文鏈接。如果你不是在點云俠的博客中看到該文章,那么此處便是不要臉的爬蟲與GPT。 一、 算法原理 Open3D中ComputePointCloudDistance函數提供了計算從源點云到目標點云的距離的方法,計算點云的距離。也…

python數據結構與算法-05_棧

棧 棧這個詞實際上在計算機科學里使用很多&#xff0c;除了數據結構外&#xff0c;還有內存里的棧區 &#xff08;和堆對應&#xff09;&#xff0c;熟悉 C 系語言的話應該不會陌生。 上一章我們講到了先進先出 queue&#xff0c;其實用 python 的內置類型 collections.deque …

【C語法學習】26 - strcmp()函數

文章目錄 1 函數原型2 參數3 返回值4 比較機制5 示例5.1 示例1 1 函數原型 strcmp()&#xff1a;比較str1指向的字符串和str2指向的字符串&#xff0c;函數原型如下&#xff1a; int strcmp(const char *str1, const char *str2);2 參數 strcmp()函數有兩個參數str1和str2&a…

HCIP-四、MUX-vlanSuper-vlan+端口安全

四、MUX-vlan&Super-vlan端口安全 MUX-vlan實驗拓撲實驗需求及解法1. 在SW1/2/3分別創建vlan10 20 30 402. SW1/2/3之間使用trunk鏈路&#xff0c;僅允許vlan10 20 30 40 通過。3. SW與PC/Server之間使用access鏈路。4. ping驗證&#xff1a; Super-vlan端口安全實驗拓撲實…

【騰訊云云上實驗室-向量數據庫】騰訊云開創新時代,發布全新向量數據庫Tencent Cloud VectorDB

前言 隨著人工智能、數據挖掘等技術的飛速發展&#xff0c;海量數據的存儲和分析越來越成為重要的研究方向。在海量數據中找到具有相似性或相關性的數據對于實現精準推薦、搜索等應用至關重要。傳統關系型數據庫存在一些缺陷&#xff0c;例如存儲效率低、查詢耗時長等問題&…

CentOS使用docker安裝OpenGauss數據庫

1.搜索OpenGauss docker search opengauss 2.選擇其中一個源拉取 docker pull docker.io/enmotech/opengauss 3.運行OpenGauss docker run --name opengauss --privilegedtrue --restartalways -d -e GS_USERNAMEpostgres -e GS_PASSWORDmyGauss2023 -p 5432:5432 docker.…

黑馬React18: ReactRouter

黑馬React: ReactRouter Date: November 21, 2023 Sum: React路由基礎、路由導航、導航傳參、嵌套路由配置 路由快速上手 1. 什么是前端路由 一個路徑 path 對應一個組件 component 當我們在瀏覽器中訪問一個 path 的時候&#xff0c;path 對應的組件會在頁面中進行渲染 2. …

2023年中國高壓驅動芯片分類、市場規模及發展趨勢分析[圖]

高壓驅動芯片是一種能在高壓環境下工作的集成電路&#xff0c;主要用于控制和驅動各種功率器件&#xff0c;如繼電器、電磁閥、電機、變頻器等。高壓驅動芯片根據其輸出電流的大小和形式可分為兩類恒流型和開關型。 高壓驅動芯片分類 資料來源&#xff1a;共研產業咨詢&#x…

藍橋杯算法雙周賽心得——迷宮逃脫(記憶化搜索)

大家好&#xff0c;我是晴天學長&#xff0c;非常經典實用的記憶化搜索題&#xff0c;當然也可以用dp做&#xff0c;我也會發dp的題解&#xff0c;需要的小伙伴可以關注支持一下哦&#xff01;后續會繼續更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .迷宮逃脫 迷官逃脫…

ubuntu操作系統中docker下Hadoop分布式前置環境配置實驗

版本&#xff1a; centos7 hadoop 3.1.3 java JDK:1.8 集群規劃&#xff1a; masterslave1slave2HDFS NameNode DataNode DataNode SecondryNameNode DataNode YARNNodeManager ResourceManage NodeManager NodeManager 1.docker容器&#xff1a; 把普通用戶加入到docker組&am…

opencv-Canny 邊緣檢測

Canny邊緣檢測是一種經典的圖像邊緣檢測算法&#xff0c;它在圖像中找到強度梯度的變化&#xff0c;從而識別出圖像中的邊緣。Canny邊緣檢測的優點包括高靈敏度和低誤檢率。 在OpenCV中&#xff0c;cv2.Canny() 函數用于執行Canny邊緣檢測。 基本語法如下&#xff1a; edges…

代碼隨想錄 134. 加油站

題目 在一條環路上有 n 個加油站&#xff0c;其中第 i 個加油站有汽油 gas[i] 升。 你有一輛油箱容量無限的的汽車&#xff0c;從第 i 個加油站開往第 i1 個加油站需要消耗汽油 cost[i] 升。你從其中的一個加油站出發&#xff0c;開始時油箱為空。 給定兩個整數數組 gas 和 cos…

本地訓練,開箱可用,Bert-VITS2 V2.0.2版本本地基于現有數據集訓練(原神刻晴)

按照固有思維方式&#xff0c;深度學習的訓練環節應該在云端&#xff0c;畢竟本地硬件條件有限。但事實上&#xff0c;在語音識別和自然語言處理層面&#xff0c;即使相對較少的數據量也可以訓練出高性能的模型&#xff0c;對于預算有限的同學們來說&#xff0c;也沒必要花冤枉…