識別和應對內存抖動

關于作者:CSDN內容合伙人、技術專家, 從零開始做日活千萬級APP。
專注于分享各領域原創系列文章 ,擅長java后端、移動開發、人工智能等,希望大家多多支持。

目錄

  • 一、導讀
  • 二、概覽
  • 三、案例分析
    • 3.1 使用memory-profiler
    • 3.2 使用 cpu-profiler
  • 四、 推薦閱讀

在這里插入圖片描述

一、導讀

我們繼續總結學習Java基礎知識,溫故知新。

二、概覽

內存抖動是指內存不穩定,頻繁分配和回收,導致內存不穩定,其表現形式為頻繁GC,

內存抖動可能會導致以下問題:

  1. 性能下降:由于頻繁的內存分配和回收操作,系統的性能會受到影響,導致運行速度變慢。
  2. 程序崩潰、OOM:內存抖動可能導致內存分配錯誤或者內存泄漏,導致程序崩潰或者運行不穩定。
  3. 系統資源消耗:內存抖動會增加系統資源的消耗,包括內存和CPU的占用率,可能導致系統負載增加。

內存抖動大部分都是由于頻繁創建對象導致,會占用大量內存,同時會產生大量的內存碎片,不連續的內存碎片很多情況下是無法被分配的。
從而導致OOM的產生。

要防止內存抖動,可以采取以下幾個方法和策略:

  1. 合理規劃內存分配:在設計和編寫代碼時,要合理規劃內存的分配和釋放,避免頻繁的內存分配和回收操作。可以使用對象池、緩沖區等技術來預先分配和管理一塊內存,減少內存分配的開銷。

  2. 避免內存碎片:內存碎片是指內存中存在一些被分割成小塊的未被使用的空間。內存碎片會導致內存分配失敗或效率低下。可以通過使用內存池、內存復用等方法來減少內存碎片的產生。另外,考慮使用內存管理工具或垃圾回收機制來自動進行內存碎片整理和回收。

  3. 優化算法和數據結構:一些算法和數據結構可能會導致內存抖動,例如頻繁的動態數組擴容和收縮操作。可以使用更合適的數據結構或算法,降低內存抖動的概率或頻率。比如使用鏈表代替數組,使用平衡二叉樹代替線性查找等。

  4. 設置適當的內存分配策略:根據實際情況,可以根據內存使用情況和需求,設置合適的內存分配策略。可以使用內存池、內存緩存等技術來預先分配和管理內存,減少頻繁的內存分配與回收操作。

  5. 進行內存性能優化:對于大型或長時間運行的應用程序,可以進行內存性能優化。可以使用內存分析工具和性能分析工具來檢測內存使用情況,找出內存抖動的原因,并針對性地進行優化。

  6. 進行定期的內存測試和性能評估:定期進行內存測試和性能評估,可以發現潛在的內存抖動問題,并進行及時修復和優化。

三、案例分析

不同的工具有不同的使用場景,對應線下場景,我們先用 android studio自帶的工具

3.1 使用memory-profiler

可以直觀的展示內存使用情況,我們先上一段代碼,來模擬內存申請及釋放

public class MainActivity extends AppCompatActivity {// Used to load the 'example' library on application startup.static {System.loadLibrary("example");}private static Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);// 循環1000次for (int index = 0; index <= 1000; index++){// 然后弄一個相對耗內存的操作,制造內存抖動String args[] = new String[1000000];}mHandler.sendEmptyMessageDelayed(0,50);}};private ActivityMainBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());// Example of a call to a native methodTextView tv = binding.sampleText;tv.setText(stringFromJNI());tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mHandler.sendEmptyMessageDelayed(0,2000);}});}/*** A native method that is implemented by the 'example' native library,* which is packaged with this application.*/public native String stringFromJNI();
}

代碼運行后,我們進行內存的保存,快速查看Java 和 Kotlin 分配情況分析
在這里插入圖片描述

在這里插入圖片描述
通過上面的圖,我們可以看到在頻繁的gc,

那我們怎么才能知道內存抖動真正發生在哪里呢,看上圖,string數組非常多,我們點一下這個string數組,如下圖:
在這里插入圖片描述
上面就出現了一個Call Stack 標簽頁,顯示該實例被分配到何處以及在哪個線程中,我們可以明顯的看到 handlemessage,
然后右鍵選擇jump to source,之間跳轉到源碼查看。

Allocations: 此類創建的實例對象數量
Total count:對象在堆中未被回收的數量

3.2 使用 cpu-profiler

使用方式跟上面差不錯,我們保存文件,然后查看,
跟蹤這一段CPU執行的時間,
如果發現某一段(應用自有函數的調用)代碼(即綠色的條形段)在反復地被執行,便是內存抖動的地方

在這里插入圖片描述

四、 推薦閱讀

Java 專欄

SQL 專欄

數據結構與算法

Android學習專欄

ddd

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

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

相關文章

磁粉制動器離合器收放卷應用介紹

張力控制系統的開環閉環應用介紹,請查看下面文章鏈接: PLC張力控制(開環閉環算法分析)_張力控制plc程序實例_RXXW_Dor的博客-CSDN博客里工業控制張力控制無處不在,也衍生出很多張力控制專用控制器,磁粉制動器等,本篇博客主要討論PLC的張力控制相關應用和算法,關于繞線…

什么是 fullgc

GC GC 全稱為garbage collection,中文含義為垃圾回收&#xff0c;在jvm中的含義為回收無用內存空間 Young space 中文名為年輕代或者新生代&#xff0c;為JVM 堆的一部分&#xff0c;由分代GC概念劃分而來&#xff0c;保存生命周期較短的對象 Tenured space 中文名為老年代…

APP外包開發的iOS開發語言

學習iOS開發需要掌握Swift編程語言和相關的開發工具、框架和技術。而學習iOS開發需要時間和耐心&#xff0c;尤其是對于初學者。通過堅持不懈的努力&#xff0c;您可以逐步掌握iOS開發技能&#xff0c;構建出功能豐富、優質的移動應用。今天和大家分享學習iOS開發的一些建議方法…

【數據結構系列】鏈表

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kuan 的首頁,持續學…

解決hbase節點已下線,但在status中顯示為dead問題

工作中需要下線4臺hbase小節點&#xff0c;下線完成后使用status 命令查看,有一臺為dead狀態: 使用status detailed 查看&#xff0c;發現“hd-03"這臺節點是dead。 檢查各節點配置文件無誤&#xff0c;并使用 /opt/hbase/bin/hbase-daemon.sh restart master 重啟兩個…

less基本使用

1 less中的變量 //對值進行聲明 link-color: #ccc//定義變量名稱 .{sleName} {}bg: background-color; //定義屬性名稱 .container {{bg}: red; }2 繼承&#xff08;復用重復樣式&#xff09; //繼承必須位于選擇器最后 //繼承選擇器名不能為變量 .a:hover:extend(.b) {}.a {…

走出迷宮(多組輸入bfs)

鏈接&#xff1a;登錄—專業IT筆試面試備考平臺_牛客網 來源&#xff1a;牛客網 題目描述 小明現在在玩一個游戲&#xff0c;游戲來到了教學關卡&#xff0c;迷宮是一個N*M的矩陣。 小明的起點在地圖中用“S”來表示&#xff0c;終點用“E”來表示&#xff0c;障礙物用“#…

淺談人工智能技術與物聯網結合帶來的好處

物聯網是指通過互聯網和各種技術將設備進行連接&#xff0c;實時采集數據、交互信息的網絡&#xff0c;對設備實現智能化自動化感知、識別和控制&#xff0c;給人們帶來便利。 人工智能是計算機科學的一個分支&#xff0c;旨在研究和開發能夠模擬人類智能的技術和方法。人工智能…

Redis: 詳解、使用教程和示例

Redis: 詳解、使用教程和示例 什么是 Redis&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的、內存數據存儲系統&#xff0c;它可以用作數據庫、緩存和消息中間件。它支持多種數據結構&#xff0c;如字符串、哈希表、列表、集合、有序集合等…

Hadoop組件

前言 Hadoop 是一個能夠對大量數據進行分布式處理的軟件框架。具有可靠、高效、可伸縮的特點。 HDFS&#xff08;hadoop分布式文件系統&#xff09; 是hadoop體系中數據存儲管理的基礎。他是一個高度容錯的系統&#xff0c;能檢測和應對硬件故障。

后院失火、持續虧損!Mobileye半年報「不回避」競爭壓力

"客戶在2023年上半年非常謹慎&#xff0c;導致增長率低于正常水平&#xff0c;但我們已經看到下半年回暖趨勢&#xff0c;預計下半年交付將比去年同期增長16%&#xff0c;遠高于上半年。"這是Mobileye在近日公司半年報發布會上的預判。 公開數據顯示&#xff0c;今年…

Python 實現Selenium錄屏的一種方法(圖片整合成動態圖)

由于UI層自動化的不穩定性&#xff0c;經常會遇到執行中斷或用例失敗的問題&#xff0c;以下是一些常見的措施。 1.詳細的日志 2.定位出錯時截圖 3.Pytest的緩存機制(可以記錄成功了哪些失敗了哪些) 4.自動重試機制(如pytest-rerunfailures) 5.用例錄像 用例錄像是最直觀的一…

2023網絡安全常用工具匯總(附學習資料+工具安裝包)

幾十年來&#xff0c;攻擊方、白帽和安全從業者的工具不斷演進&#xff0c;成為網絡安全長河中最具技術特色的燈塔&#xff0c;并在一定程度上左右著網絡安全產業發展和演進的方向&#xff0c;成為不可或缺的關鍵要素之一。 話不多說&#xff0c;網絡安全10款常用工具如下 1、…

Opencv4基于C++基礎入門筆記:圖像 顏色 事件響應 圖形 視頻 直方圖

效果圖??????&#xff1a;opencv人臉識別效果圖(請叫我真愛粉) 先看一下效果圖勾起你的興趣&#xff01; 文章目錄&#xff1a; 一&#xff1a;環境配置搭建 二&#xff1a;圖像 1.圖像讀取與顯示 main.cpp 運行結果 2.圖像色彩空間轉換 2.1 換色彩 test.h …

感受RFID服裝門店系統的魅力

嘿&#xff0c;親愛的時尚追隨者們&#xff01;今天小編要給你們帶來一股時尚新風潮&#xff0c;讓你們感受一下什么叫做“RFID服裝門店系統”&#xff0c;這個超酷的東西&#xff01; 別著急&#xff0c;先別翻白眼&#xff0c;小編來解釋一下RFID是什么玩意兒。它是射頻識別…

云計算——存儲虛擬化功能

作者簡介&#xff1a;一名云計算網絡運維人員、每天分享網絡與運維的技術與干貨。 座右銘&#xff1a;低頭趕路&#xff0c;敬事如儀 個人主頁&#xff1a;網絡豆的主頁????? 目錄 前期回顧 前言 一.存儲虛擬化功能 1.精簡磁盤和空間回收 2.快照 &#xff08;1&a…

面試熱題(反轉字符串中的單詞)

給你一個字符串 s &#xff0c;請你反轉字符串中 單詞 的順序。 單詞 是由非空格字符組成的字符串。s 中使用至少一個空格將字符串中的 單詞 分隔開。 返回 單詞 順序顛倒且 單詞 之間用單個空格連接的結果字符串。 注意&#xff1a;輸入字符串 s中可能會存在前導空格、尾隨空格…

JVM——棧和堆概述,以及有什么區別?

方法棧 方法棧并不是某一個 JVM 的內存空間&#xff0c;而是我們描述方法被調用過程的一個邏輯概念。 在同一個線程內&#xff0c;T1()調用T2()&#xff1a; T1()先開始&#xff0c;T2()后開始&#xff1b;T2()先結束&#xff0c;T1()后結束。 堆和棧概述 從英文單詞角度來…

Maven介紹,部署在eclipse中

目錄 一.Maven介紹 1&#xff0c;什么是maven&#xff1f; 2. 為什么maven會在企業中大量使用&#xff1f; 3.沒有使用maven的前后區別? 4.maven在Java開發中的實際效果圖 二.maven部署在eclipse中 1.下載maven在其官方網址下載&#xff08;當然實際下載也要根據個人的…

服務器安裝Tomcat

下載Tomcat 下載地址在這&#xff1a; Tomcat官網 下載完成以后把壓縮包上傳到服務器中&#xff08;我傳到了www/java&#xff09;,進行解壓(解壓到)&#xff0c;如果沒有進行指定解壓到哪里&#xff0c;默認是到root文件夾中 tar -zxvf /www/java/apache-tomcat-9.0.103.tar.…