谷粒商城:性能壓測JVM堆區

目錄

Kit

Apache JMeter

VisualVM

堆內存

jvm內存模型

垃圾回收(Garbage Collection, GC)

新對象分配內存

GC步驟

MinorGC

性能優化

影響因素

優化

nginx動靜分離

優化三級分類獲取

Jvm參數配置堆區

測試


Kit

Apache JMeter

壓力測試,模擬大量用戶并發訪問

VisualVM

監控、分析和調優 Java 應用程序的性能

VisualGC 插件:監控垃圾回收


堆內存

jvm內存模型

    堆區:

    所有對象實例和數組都存儲在堆區,堆區是線程共享的,所有線程都可以訪問堆中的對象。

    堆區結構:

    • 年輕代(Young Generation)

      • Eden 區:新創建的對象首先分配在這里。

      • Survivor 區:分為 From 和 To 區,存放經過一次 GC 后仍然存活的對象。

    • 老年代(Old Generation):存放長期存活的對象。

    • 元空間(Metaspace):存放類的元數據(如類定義、方法信息等)。

    垃圾回收(Garbage Collection, GC)

    新對象分配內存

    1. 新創建的對象首先分配在 Eden 區
    2. 當 Eden 區滿時,觸發 Minor GC
    3. MinorGC后,若Eden區放得下,則存入Eden區
    4. 若MinorGC后,Eden空間仍然不足,則為大對象,直接分配至Old區
    5. 若Old區空間不足,觸發FullGC,對整個堆內存進行垃圾回收。

    GC步驟

    (1) 標記(Marking)

    • 遍歷所有對象,標記哪些對象是存活的(被引用的),哪些是垃圾(未被引用)。

    • 從 GC Roots(如線程棧、靜態變量等)開始,遞歸標記所有可達對象。

    (2) 清除(Sweeping)

    • 清除未被標記的垃圾對象,釋放它們占用的內存空間。

    • 清除后,內存可能會產生碎片。

    (3) 壓縮(Compacting)

    • 將存活的對象移動到內存的一端,整理出連續的內存空間,減少內存碎片。

    • 這一步不是所有 GC 算法都會執行(如 CMS 就不壓縮)。

    MinorGC

    1. 標記 Eden 區和 From 區(當前活動的 Survivor 區)中的存活對象。
    2. 將存活的對象復制到 To 區(另一個 Survivor 區)。
    3. 清空 Eden 區和 From 區,From和To角色互換

    角色交換

    • 在下次 Minor GC 時,原來的?To 區?變為新的?From 區,而原來的?From 區?變為新的?To 區

    • 這種交換確保了每次 Minor GC 都有一個空的 Survivor 區用于存放存活對象。?

    對象晉升:?

    • 如果對象在 Survivor 區中經歷了多次 Minor GC(默認是 15 次,可以通過?-XX:MaxTenuringThreshold?參數調整),它會被晉升到?老年代

    ?為什么需要兩個 Survivor 區?

    • 減少內存碎片:通過復制算法,將存活對象從一個 Survivor 區復制到另一個 Survivor 區,可以整理內存,減少碎片。

    • 提高垃圾回收效率:每次 Minor GC 只需要處理 Eden 區和其中一個 Survivor 區,而不是整個年輕代。


    性能優化

    影響因素

    中間件

    • client - > nginx - > 網關 - > server????????中間件越多,網絡IO交互越多,性能損耗越大

    業務

    • ?DB(MySQl優化)
    • 模板渲染(開啟緩存)
    • 靜態資源(動靜分離)

    優化

    1.日志:僅報錯

    logging:level:com.elysia.gulimall.product: error

    2. MySQL加索引

    3.thtmeleaf 開啟ceche

    4.nginx動靜分離

    5.優化業務邏輯

    6.通過 JVM 參數(如?-Xmx?和?-Xms)進行配置堆區

    nginx動靜分離

    將js,css,img等靜態資源存放在nginx中,靜態資源由nginx返回。

    目錄:

    nginx/html/static/index :css,js,img,json

    請求靜態資源:

    ????????gulimall.com/static/index/js/catalogLoader.js

    config:

    upstream gulimall {server 192.168.40.1:88;
    }server {listen       80;server_name  gulimall.com;location /static/ {root   /usr/share/nginx/html;}location / {proxy_set_header Host $host;proxy_pass http://gulimall;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}}   
    

    優化三級分類獲取

    原代碼13行和19行多次查詢數據庫,獲取子分類list

        @Overridepublic List<CategoryEntity> getLevel1Category() {return this.list(new QueryWrapper<CategoryEntity>().eq("cat_level",1).eq("show_status",1));}@Overridepublic Map<String, List<Level2CategoryVo>> getLevel2AndLevel3Category() {//一級分類List<CategoryEntity> level1 = this.getLevel1Category();Map<String, List<Level2CategoryVo>> categoryMap = level1.stream().collect(Collectors.toMap(k -> k.getCatId().toString(),v ->{//查詢該一級分類下的二級分類List<CategoryEntity> level2List = this.list(new QueryWrapper<CategoryEntity>().eq("parent_cid", v.getCatId()));List<Level2CategoryVo> level2CategoryVos = null;if (level2List != null){level2CategoryVos = level2List.stream().map(level2 -> {//查詢 二級分類 下的 三級分類List<CategoryEntity> level3List = this.list(new QueryWrapper<CategoryEntity>().eq("parent_cid", level2.getCatId()));List<Level2CategoryVo.Level3Category> collect = null;if (level3List != null) {collect = level3List.stream().map(level3 -> {Level2CategoryVo.Level3Category level3Category = new Level2CategoryVo.Level3Category(level2.getCatId(), level3.getCatId(), level3.getName());return level3Category;}).collect(Collectors.toList());}Level2CategoryVo level2CategoryVo = new Level2CategoryVo(v.getCatId(), collect, level2.getCatId(), level2.getName());return level2CategoryVo;}).collect(Collectors.toList());}return level2CategoryVos;}));return categoryMap;}

    獲取全部分類,通過filter獲取某分類的子分類list

        @Overridepublic Map<String, List<Level2CategoryVo>> getLevel2AndLevel3Category() {List<CategoryEntity> selectList = this.baseMapper.selectList(null);//一級分類List<CategoryEntity> level1 = this.getByParentCid(selectList,0L);Map<String, List<Level2CategoryVo>> categoryMap = level1.stream().collect(Collectors.toMap(k -> k.getCatId().toString(),v ->{//查詢該一級分類下的二級分類List<CategoryEntity> level2List = getByParentCid(selectList,v.getCatId());List<Level2CategoryVo> level2CategoryVos = null;if (level2List != null){level2CategoryVos = level2List.stream().map(level2 -> {//查詢 二級分類 下的 三級分類List<CategoryEntity> level3List = getByParentCid(selectList,level2.getCatId());List<Level2CategoryVo.Level3Category> collect = null;if (level3List != null) {collect = level3List.stream().map(level3 -> {Level2CategoryVo.Level3Category level3Category = new Level2CategoryVo.Level3Category(level2.getCatId(), level3.getCatId(), level3.getName());return level3Category;}).collect(Collectors.toList());}Level2CategoryVo level2CategoryVo = new Level2CategoryVo(v.getCatId(), collect, level2.getCatId(), level2.getName());return level2CategoryVo;}).collect(Collectors.toList());}return level2CategoryVos;}));return categoryMap;}private List<CategoryEntity> getByParentCid(List<CategoryEntity> selectList,Long parentCid) {return selectList.stream().filter(categoryEntity -> {return categoryEntity.getParentCid().equals(parentCid); } ).collect(Collectors.toList());}

    Jvm參數配置堆區

    將堆區固定為1024m,Eden區 512m

    測試

    全鏈路測試,請求首頁

    50線程數,吞吐量:1100/s

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

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

    相關文章

    STM32全系大閱兵(2)

    接前一篇文章:STM32全系大閱兵(1) 本文內容參考: STM32家族系列的區別_stm32各個系列區別-CSDN博客 STM32--STM32 微控制器詳解-CSDN博客

    7、基于osg引擎實現讀取vtk數據通過著色器實現簡單體渲染(1)

    1、頂點著色器代碼 #version 110 /* GLSL 1.10需要顯式聲明精度 (OpenGL ES要求) */ #ifdef GL_ES precision highp float; #endif // 體數據采樣步長 uniform float xStepSize,yStepSize,zStepSize; // 體數據紋理和顏色紋理 uniform sampler3D baseTexture; uniform sample…

    基于Ollama平臺部署的Qwen大模型實現聊天機器人

    文章目錄 基于Ollama平臺部署的Qwen大模型實現聊天機器人1 概述2 技術棧2.1 開發技術2.2 環境 3 實現步驟3.1 環境搭建3.1.1 WSL配置及Ubuntu安裝3.1.2 Ollama安裝及模型部署 3.2 模塊安裝3.2.1 安裝Streamlit 1.42.23.2.2 安裝requests 2.32.33.2.3 安裝ollama 0.4.7 3.3 后端…

    用DasViewer的時候3Dtiles 轉osgb 可以直接指定目標坐標系嗎?

    沒有指定坐標系選項&#xff0c;可以轉換后&#xff0c;再進行一次坐標系轉換。 DasViewer是一款免費極速實景三維模型瀏覽器&#xff0c;采用多細節層次模型逐步自適應加載技術,讓用戶在極低的電腦配置下,也能流暢的加載較大規模實景三維模型,提供方便快捷的數據瀏覽操作。 目…

    【MySQL】MySQL服務器——mysqld

    1.MySQL服務器 是名為 mysqld 的數據庫服務器程序&#xff0c;和“主機”&#xff08;host&#xff09;不一樣是一個多線程的單進程管理對磁盤和內存中數據庫的訪問支持并發的客戶端連接支持多個存儲引擎&#xff0c;常見的存儲引擎包括InnoDB、MyISAM、Memory、Archive支持事…

    vue啟動 localhost無法訪問

    1. localhost 和 127.0.0.1 雖然都指向本機&#xff0c;但它們有細微的區別&#xff1a; - localhost 是一個域名&#xff0c;需要通過 DNS 解析或本地 hosts 文件解析為 IP 地址 - 127.0.0.1 是直接的 IP 地址&#xff0c;不需要解析過程 2. 無法訪問 localhost 的可…

    爬蟲案例十三js逆向模擬登錄中大網校

    提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、網站分析二、代碼 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; js 逆向模擬登錄中大網校 提示&#xff1a;以下是本篇文章正文內…

    Java IO 與文件系統:File 類與流操作詳解

    在 Java 編程中&#xff0c;IO&#xff08;輸入輸出&#xff09;操作是處理文件和數據流的核心部分。本文將圍繞文件系統、硬盤存儲、Java 的 File 類以及 InputStream 和 OutputStream 的使用進行詳細總結&#xff0c;幫助讀者全面掌握 Java IO 編程的核心知識。 一、IO、存儲…

    我與DeepSeek讀《大型網站技術架構》(13)- 大型網站典型故障案例分析

    文章目錄 第13章 大型網站典型故障案例分析日志管理缺陷引發的故障高并發數據庫訪問問題鎖機制濫用導致服務超時緩存運維不當引發的全站癱瘓流程不規范導致的線上事故編程習慣問題引發功能異常生產環境濫用問題其他典型問題總結 第13章 大型網站典型故障案例分析 本章通過九個…

    Git與GitHub:它們是什么,有什么區別與聯系?

    1.Git是什么&#xff1f; Git 是一個開源的、分布式版本控制系統&#xff08;Version Control System, VCS&#xff09;&#xff0c;由 Linus Torvalds 于 2005 年開發&#xff0c;最初用于管理 Linux 內核的開發。它的核心功能是跟蹤文件的變更歷史&#xff0c;幫助開發者高效…

    江科大51單片機筆記【12】AT24C02(I2C總線)

    寫在前言 此為博主自學江科大51單片機&#xff08;B站&#xff09;的筆記&#xff0c;方便后續重溫知識 在后面的章節中&#xff0c;為了防止篇幅過長和易于查找&#xff0c;我把一個小節分成兩部分來發&#xff0c;上章節主要是關于本節課的硬件介紹、電路圖、原理圖等理論知識…

    ClickHouse SQL優化:從原理到實戰的深度指南

    目錄 ?ClickHouse架構核心解析 1.1 列式存儲的利刃與短板 1.2 MergeTree引擎的物理存儲密碼 1.3 向量化執行引擎的運算革命 ?數據建模的黃金法則 2.1 分區鍵設計的二十倍性能差異實驗 2.2 主鍵排序的磁盤命中率法則 2.3 稀疏索引的數學選擇策略 ?SQL優化十誡 3.1 查詢模式反…

    面試之《前端常見的設計模式》

    前端開發中運用多種設計模式可以提高代碼的可維護性、可擴展性和可復用性。以下是一些常見的前端設計模式&#xff1a; 創建型模式 1. 單例模式 定義&#xff1a;確保一個類只有一個實例&#xff0c;并提供一個全局訪問點。應用場景&#xff1a;在前端中&#xff0c;像全局狀…

    Unity Android出包

    Unity Android出包 1.Android Studio版本 不能高于Unity的版本 2.so庫 這個庫需要自己拷貝到Android工程當中 3.JDK版本太老 編譯可以正常&#xff0c;但無法運行 File->ProjectStructure->SDK Location->Gradle Setting->Gradle JDK->X:/Android Stuido/jre …

    Android 中臨時文件存放路徑選擇

    在 Android 中&#xff0c;下載臨時文件通常可以放在以下目錄中&#xff0c;具體選擇取決于應用的需求和目標 Android 版本的限制&#xff1a; 1. 通用臨時目錄&#xff08;/data/local/tmp/&#xff09; 這是 Android 系統提供的一個通用臨時目錄&#xff0c;適用于存儲臨時…

    【軟件測試】--面試

    準備簡歷–面試邀請 投遞簡歷 面試&#xff08;筆試&#xff0c;HR面試&#xff0c;技術官面試&#xff09; 入職準備&#xff08;體檢&#xff0c;背調&#xff09; 辦理入職&#xff08;簽合同&#xff09; 入職培訓 試用期 轉正 【簡歷要點】 1.基本信息 學校專業&#xff…

    C盤清理技巧分享:釋放空間,提升電腦性能

    目錄 1. 引言 2. C盤空間不足的影響 3. C盤清理的必要性 4. C盤清理的具體技巧 4.1 刪除臨時文件 4.2 清理系統還原點 4.3 卸載不必要的程序 4.4 清理下載文件夾 4.5 移動大文件到其他盤 4.6 清理系統緩存 4.7 使用磁盤清理工具 4.8 清理Windows更新文件 4.9 禁用…

    rpm安裝nux-dextop時出現 epel-release is needed的解決方案

    大家好,我是愛編程的喵喵。雙985碩士畢業,現擔任全棧工程師一職,熱衷于將數據思維應用到工作與生活中。從事機器學習以及相關的前后端開發工作。曾在阿里云、科大訊飛、CCF等比賽獲得多次Top名次。現為CSDN博客專家、人工智能領域優質創作者。喜歡通過博客創作的方式對所學的…

    qt加載VeloView工程

    接上一篇點云軟件配置與編譯&#xff0c;使用qt加載需要先完成編譯。編譯完成后到編譯目錄下lidarview-superbuild\common-superbuild\lidarview\build 找到CmakeCache.txt&#xff0c;如下是我的編譯目錄。 使用QT6.5.3加載了CmakeCache.txt&#xff0c;QT5.14還加載不了cmake…

    python編寫的一個打磚塊小游戲

    游戲介紹 打磚塊是一款經典的街機游戲&#xff0c;玩家控制底部的擋板&#xff0c;使球反彈以擊碎上方的磚塊。當球擊中磚塊時&#xff0c;磚塊消失&#xff0c;球反彈&#xff1b;若球碰到擋板&#xff0c;則改變方向繼續運動&#xff1b;若球掉出屏幕底部&#xff0c;玩家失…