Android磁盤占用優化全解析:從監控到治理的存儲效率革命

引言

隨著移動應用功能的復雜化,磁盤占用問題日益突出。據統計,國內頭部應用的平均安裝包大小已超100MB,運行時緩存、日志、圖片等數據更可能使磁盤占用突破GB級。過度的磁盤消耗不僅影響用戶設備空間,還可能觸發系統的“應用數據過多”警告,導致用戶卸載。本文將從磁盤監控、存儲目錄解析、優化策略三個維度展開,結合Android系統API與實際代碼示例,系統性講解磁盤占用的全流程優化。

一、磁盤占用監控:從開發到線上的精準定位

優化的前提是精準監控。本節將介紹開發期工具、系統API以及線上監控方案,幫助開發者快速定位“磁盤膨脹”的根源。

1.1 開發期工具:Android Studio 存儲分析

Android Studio提供了Storage Profiler(存儲分析器)和Device File Explorer(設備文件瀏覽器),可直觀查看應用的文件、數據庫、共享首選項等存儲內容的大小和分布。

(1)Storage Profiler實戰

通過Storage Profiler可實時監控:

  • 應用內部存儲(/data/data/<包名>)的文件、數據庫、SP大小;
  • 外部存儲(/storage/emulated/0/Android/data/<包名>)的緩存、圖片等數據;
  • 隨時間變化的存儲增長曲線(見圖1)。

操作步驟

  1. 連接設備,打開Android Studio的Profiler面板;
  2. 選擇目標應用,點擊Storage標簽;
  3. 觸發存儲操作(如加載圖片、保存日志),觀察各分類的大小變化;
  4. 點擊具體文件類型(如Files),查看詳細文件列表及路徑。
(2)Device File Explorer深度排查

通過Device File Explorer可直接訪問設備文件系統,手動查看文件內容并刪除測試數據。

注意:需通過adb root獲取root權限(模擬器默認開啟),否則無法訪問內部存儲的私有目錄。

1.2 系統API:代碼級存儲監控

通過Android系統提供的StatFsContextFile類,可在代碼中主動獲取存儲信息。

(1)獲取存儲容量(總空間/可用空間)

使用StatFs(API 18+)獲取文件系統的容量信息,支持內部存儲和外部存儲。

示例:計算內部存儲可用空間

fun getInternalStorageFreeSpace(): Long {val dataDir = Environment.getDataDirectory() // 內部存儲根目錄(/data)val statFs = StatFs(dataDir.path)val blockSize = statFs.blockSizeLong // 塊大小(字節)val availableBlocks = statFs.availableBlocksLong // 可用塊數return availableBlocks * blockSize
}// 外部存儲(SD卡)可用空間(需權限android.permission.READ_EXTERNAL_STORAGE)
fun getExternalStorageFreeSpace(): Long {val externalDir = Environment.getExternalStorageDirectory() // 外部存儲根目錄(/storage/emulated/0)val statFs = StatFs(externalDir.path)val blockSize = statFs.blockSizeLongval availableBlocks = statFs.availableBlocksLongreturn availableBlocks * blockSize
}
(2)統計應用目錄大小

遍歷應用專屬目錄(如filescache),遞歸計算所有文件的總大小。

示例:計算應用緩存目錄大小

fun getCacheDirSize(context: Context): Long {val cacheDir = context.cacheDir // 內部緩存目錄(/data/data/<包名>/cache)return calculateDirSize(cacheDir)
}private fun calculateDirSize(dir: File): Long {if (!dir.exists()) return 0Lvar totalSize = 0Lval files = dir.listFiles()if (files != null) {for (file in files) {totalSize += if (file.isDirectory) {calculateDirSize(file) // 遞歸子目錄} else {file.length() // 文件大小(字節)}}}return totalSize
}

1.3 線上監控:用戶真實場景數據上報

開發期工具適合調試,線上環境需通過日志上報收集用戶的存儲使用數據,重點監控:

  • 應用總存儲大小(內部+外部);
  • 各子目錄(如cachefiles/image)的大小占比;
  • 異常大文件(如單個文件超過100MB)。

示例:線上存儲監控上報

class StorageMonitor {fun reportStorageUsage(context: Context) {val internalCacheSize = getCacheDirSize(context)val externalCacheSize = getExternalCacheDirSize(context) // 外部緩存目錄(/storage/emulated/0/Android/data/<包名>/cache)val filesDirSize = calculateDirSize(context.filesDir)val databasesSize = calculateDirSize(context.getDatabasePath("app.db").parentFile) // 數據庫目錄// 上報到后臺(使用埋點SDK)Analytics.report("storage_usage", mapOf("internal_cache" to internalCacheSize,"external_cache" to externalCacheSize,"files_dir" to filesDirSize,"databases" to databasesSize))}private fun getExternalCacheDirSize(context: Context): Long {val externalCacheDir = context.externalCacheDir // Android 4.4+無需權限return externalCacheDir?.let { calculateDirSize(it) } ?: 0L}
}

二、存儲目錄解析:理解Android的存儲架構

Android的存儲分為內部存儲外部存儲,不同目錄的生命周期、訪問權限和優化策略差異顯著。

2.1 內部存儲(Internal Storage)

內部存儲是應用私有的存儲空間,路徑為/data/data/<包名>/,僅應用自身可訪問(需root權限除外)。

核心子目錄:
目錄路徑特點優化方向
files/data/data/<包名>/files長期存儲數據(如用戶配置),應用卸載后刪除清理過期數據
cache/data/data/<包名>/cache臨時緩存(如網絡請求臨時文件),系統可能自動清理限制最大容量
databases/data/data/<包名>/databasesSQLite數據庫存儲目錄優化表結構、刪除冗余數據
shared_prefs/data/data/<包名>/shared_prefsSharedPreferences存儲的XML文件(如用戶設置)合并SP文件、減少冗余鍵值

2.2 外部存儲(External Storage)

外部存儲包括設備內置的大容量存儲(如手機存儲)或可移除的SD卡,路徑為/storage/emulated/0/(虛擬路徑)。根據Android版本不同,訪問權限差異較大:

(1)應用專屬目錄(App-specific Storage)

路徑為/storage/emulated/0/Android/data/<包名>/,應用卸載后自動刪除,無需READ_EXTERNAL_STORAGE權限(Android 4.4+)。

核心子目錄

  • files:長期存儲(如用戶下載的文件);
  • cache:臨時緩存(如圖片緩存);
  • obb:OBB擴展文件(如游戲資源包)。

示例:獲取外部專屬目錄

// 外部files目錄(如/storage/emulated/0/Android/data/<包名>/files)
val externalFilesDir = context.getExternalFilesDir(null)// 外部圖片子目錄(自動創建)
val externalImageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
(2)公共目錄(Public Storage)

路徑為/storage/emulated/0/DCIM/storage/emulated/0/Download等,所有應用可訪問,需READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE權限(Android 10+需通過MediaStore訪問)。

注意:公共目錄的數據在應用卸載后不會刪除,需謹慎使用,僅用于用戶主動保存的內容(如用戶導出的圖片)。

2.3 不同存儲目錄的選擇策略

場景推薦目錄原因
敏感數據(如用戶Token)內部存儲files私有性強,外部無法訪問
臨時緩存(如網絡圖片)內部/外部cache系統可自動清理,避免占用用戶空間
用戶生成內容(如導出圖片)外部公共目錄(DCIM用戶可通過相冊查看,卸載后保留

三、磁盤優化策略:從代碼到架構的深度治理

通過監控定位高占用目錄后,需針對具體場景制定優化策略。本節將結合常見存儲場景,提供代碼級解決方案。

3.1 緩存優化:限制容量與自動清理

緩存是磁盤占用的“重災區”,需通過容量限制過期策略避免無限增長。

(1)內存緩存(LruCache)與磁盤緩存(DiskLruCache)結合
  • LruCache:內存緩存,限制最大條目數(如設備內存的1/8);
  • DiskLruCache:磁盤緩存,限制最大容量(如100MB),自動刪除最久未使用(LRU)的文件。

示例:配置DiskLruCache

class ImageCache(context: Context) {private val diskCacheSize = 100 * 1024 * 1024 // 100MBprivate val diskCache: DiskLruCacheinit {val cacheDir = getDiskCacheDir(context, "image_cache")if (!cacheDir.exists()) cacheDir.mkdirs()diskCache = DiskLruCache.open(cacheDir, 1, // 每個key對應1個文件1, // 每個文件版本號diskCacheSize)}// 獲取緩存目錄(優先外部存儲,否則內部)private fun getDiskCacheDir(context: Context, uniqueName: String): File {val externalCacheDir = context.externalCacheDirreturn if (externalCacheDir != null && externalCacheDir.canWrite()) {File(externalCacheDir, uniqueName)} else {File(context.cacheDir, uniqueName)}}// 緩存圖片fun putImage(url: String, bitmap: Bitmap) {val key = hashKeyForDisk(url)val editor = diskCache.edit(key) ?: returntry {val outputStream = editor.newOutputStream(0)bitmap.compress(Bitmap.CompressFormat.WEBP, 80, outputStream)editor.commit()} finally {editor.abortUnlessCommitted()}}// 獲取緩存圖片fun getImage(url: String): Bitmap? {val key = hashKeyForDisk(url)val snapshot = diskCache.get(key) ?: return nullval inputStream = snapshot.getInputStream(0)return BitmapFactory.decodeStream(inputStream)}// URL轉哈希鍵(避免特殊字符)private fun hashKeyForDisk(key: String): String {return try {val messageDigest = MessageDigest.getInstance("MD5")messageDigest.update(key.toByteArray())bytesToHex(messageDigest.digest())} catch (e: NoSuchAlgorithmException) {key.hashCode().toString()}}private fun bytesToHex(bytes: ByteArray): String {val hexString = StringBuilder()for (byte in bytes) {val hex = String.format("%02x", byte)hexString.append(hex)}return hexString.toString()}
}
(2)設置緩存過期時間

為緩存文件添加時間戳,定期清理過期數據(如超過7天的緩存)。

示例:自動清理過期緩存

fun cleanExpiredCache(cacheDir: File, maxAge: Long) {val currentTime = System.currentTimeMillis()val files = cacheDir.listFiles() ?: returnfor (file in files) {if (file.isDirectory) {cleanExpiredCache(file, maxAge) // 遞歸子目錄} else {val lastModified = file.lastModified()if (currentTime - lastModified > maxAge) { // 超過最大年齡file.delete()}}}
}// 調用:清理7天前的緩存(7*24*3600*1000)
cleanExpiredCache(context.cacheDir, 7 * 24 * 3600 * 1000L)

3.2 大文件管理:壓縮、分塊與按需加載

圖片、視頻、日志等大文件是磁盤占用的主要來源,需通過壓縮分塊存儲按需加載優化。

(1)圖片壓縮
  • 分辨率壓縮:根據設備屏幕尺寸加載合適分辨率的圖片(如1080P設備加載1080P圖,而非4K圖);
  • 質量壓縮:調整JPEG/WebP的壓縮質量(如列表圖壓縮至80%,詳情頁壓縮至90%)。

示例:圖片壓縮工具類

object ImageCompressor {fun compress(bitmap: Bitmap, maxSize: Int = 200 * 1024): ByteArray {val outputStream = ByteArrayOutputStream()var quality = 100bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream)var byteArray = outputStream.toByteArray()// 循環壓縮直到小于maxSize(200KB)while (byteArray.size > maxSize && quality > 10) {quality -= 10outputStream.reset()bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream)byteArray = outputStream.toByteArray()}return byteArray}
}
(2)日志分塊存儲

將大日志文件按時間或大小分塊(如每天一個文件,每個文件不超過10MB),避免單個文件過大。

示例:分塊日志寫入

class ChunkedLogWriter(context: Context) {private val logDir = File(context.filesDir, "logs")private var currentFile: File? = nullprivate var currentSize = 0Lprivate val maxFileSize = 10 * 1024 * 1024 // 10MBinit {if (!logDir.exists()) logDir.mkdirs()}fun writeLog(log: String) {val currentTime = System.currentTimeMillis()val fileName = "log_${SimpleDateFormat("yyyyMMdd", Locale.CHINA).format(Date(currentTime))}.txt"val newFile = File(logDir, fileName)// 切換文件:新日期或當前文件超過最大大小if (currentFile == null || currentFile!!.name != fileName || currentSize > maxFileSize) {currentFile = newFilecurrentSize = newFile.length()}// 寫入日志currentFile?.appendText("$log\n")currentSize += log.length + 1 // 換行符}
}
(3)按需加載與刪除

僅在需要時下載大文件(如用戶打開某頁面時加載對應的資源包),使用后及時刪除不再需要的文件。

示例:按需加載資源包

suspend fun loadResourcePack(packName: String) {val resourceDir = File(context.filesDir, "resources")val packFile = File(resourceDir, "$packName.zip")if (!packFile.exists()) {// 下載資源包(僅Wi-Fi時)if (isWifiConnected(context)) {val response = okHttpClient.newCall(Request.Builder().url("https://example.com/resources/$packName.zip").build()).execute()response.body?.byteStream()?.use { input ->FileOutputStream(packFile).use { output ->input.copyTo(output)}}} else {throw IOException("僅支持Wi-Fi下載資源包")}}// 使用資源包...// 使用后標記為可刪除(如7天未使用則清理)packFile.setLastModified(System.currentTimeMillis())
}// 清理7天未使用的資源包
fun cleanUnusedResources() {val resourceDir = File(context.filesDir, "resources")val sevenDaysAgo = System.currentTimeMillis() - 7 * 24 * 3600 * 1000resourceDir.listFiles()?.forEach { file ->if (file.lastModified() < sevenDaysAgo) {file.delete()}}
}

3.3 數據庫優化:減少冗余與索引優化

SQLite數據庫的不合理使用(如冗余字段、未優化的查詢)會導致磁盤占用激增。

(1)減少冗余數據
  • 字段精簡:移除不再使用的字段;
  • 關聯表設計:通過外鍵關聯表,避免重復存儲相同數據(如用戶信息與訂單信息分離)。

示例:優化用戶-訂單表結構

-- 優化前(冗余存儲用戶姓名)
CREATE TABLE orders (order_id INTEGER PRIMARY KEY,user_id INTEGER,user_name TEXT, -- 冗余字段amount REAL
);-- 優化后(通過user_id關聯)
CREATE TABLE users (user_id INTEGER PRIMARY KEY,user_name TEXT
);CREATE TABLE orders (order_id INTEGER PRIMARY KEY,user_id INTEGER,amount REAL,FOREIGN KEY (user_id) REFERENCES users(user_id)
);
(2)使用WAL模式與自動 vacuum
  • WAL(Write-Ahead Logging):替代傳統的回滾日志,減少磁盤IO,提升性能(默認開啟);
  • 自動 vacuum:定期執行VACUUM命令,回收被刪除數據占用的磁盤空間。

示例:配置SQLiteOpenHelper

class AppDatabaseHelper(context: Context) : SQLiteOpenHelper(context, "app.db", null, 1
) {override fun onCreate(db: SQLiteDatabase) {db.execSQL("CREATE TABLE users (user_id INTEGER PRIMARY KEY, name TEXT)")db.execSQL("CREATE TABLE orders (order_id INTEGER PRIMARY KEY, user_id INTEGER, amount REAL)")}override fun onConfigure(db: SQLiteDatabase) {super.onConfigure(db)db.enableWriteAheadLogging() // 啟用WAL模式}fun vacuumDatabase() {writableDatabase.execSQL("VACUUM") // 手動觸發清理}
}
(3)索引優化

合理使用索引可減少查詢時間,但過多索引會增加磁盤占用。需權衡索引數量與查詢效率。

示例:為高頻查詢字段添加索引

-- 為orders表的user_id添加索引(高頻查詢條件)
CREATE INDEX idx_orders_user_id ON orders(user_id);

3.4 臨時文件與重復文件清理

臨時文件(如拍照緩存、下載臨時包)和重復文件(如用戶多次下載同一資源)是磁盤的“隱形殺手”。

(1)臨時文件自動清理
  • 生命周期綁定:臨時文件的生命周期與對應操作綁定(如拍照后若用戶取消,立即刪除緩存);
  • 應用啟動/退出時清理:在Application.onCreate()Activity.onDestroy()中清理臨時目錄。

示例:拍照臨時文件清理

class CameraActivity : AppCompatActivity() {private var tempImageFile: File? = nullfun takePhoto() {tempImageFile = createTempImageFile() // 創建臨時文件val photoUri = FileProvider.getUriForFile(this, "$packageName.fileprovider", tempImageFile!!)val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply {putExtra(MediaStore.EXTRA_OUTPUT, photoUri)}startActivityForResult(intent, REQUEST_IMAGE_CAPTURE)}override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode != RESULT_OK) {// 用戶取消,刪除臨時文件tempImageFile?.delete()}}private fun createTempImageFile(): File {val storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES)return File.createTempFile("JPEG_${System.currentTimeMillis()}_", ".jpg", storageDir)}
}
(2)重復文件檢測

通過哈希值(如MD5、SHA-1)檢測重復文件,僅保留一份。

示例:重復文件檢測工具

fun findDuplicateFiles(dir: File): Map<String, List<File>> {val hashMap = mutableMapOf<String, MutableList<File>>()val files = dir.listFiles() ?: return hashMapfor (file in files) {if (file.isFile) {val hash = computeFileHash(file)hashMap.getOrPut(hash) { mutableListOf() }.add(file)}}// 過濾僅保留重復的文件(列表大小>1)return hashMap.filterValues { it.size > 1 }
}private fun computeFileHash(file: File): String {val messageDigest = MessageDigest.getInstance("SHA-256")FileInputStream(file).use { input ->val buffer = ByteArray(8192)var bytesRead: Intwhile (input.read(buffer).also { bytesRead = it } != -1) {messageDigest.update(buffer, 0, bytesRead)}}return bytesToHex(messageDigest.digest())
}

四、磁盤優化驗證:從實驗室到用戶的效果評估

優化完成后,需通過實驗室測試和用戶場景模擬驗證效果。

4.1 實驗室測試工具

  • Android Studio Storage Profiler:對比優化前后各目錄的大小變化;
  • adb命令:通過adb shell du -sh /data/data/<包名>查看應用總存儲大小;
  • SQLite Browser:手動檢查數據庫文件大小,驗證冗余數據清理效果。

4.2 用戶場景模擬

通過模擬用戶高頻操作(如下載、拍照、緩存加載),觀察磁盤占用的增長趨勢:

# 模擬連續拍照(生成臨時文件)
adb shell am start -n com.example.app/.CameraActivity
adb shell input keyevent KEYCODE_CAMERA# 模擬大量圖片加載(觸發緩存)
adb shell am start -n com.example.app/.ImageListActivity

五、總結

磁盤占用優化是一個“監控-分析-治理-驗證”的閉環過程。核心策略包括:

  1. 緩存優化:限制容量、設置過期時間;
  2. 大文件管理:壓縮、分塊、按需加載;
  3. 數據庫優化:減少冗余、索引優化;
  4. 臨時文件清理:生命周期綁定、重復文件檢測。

開發者需建立“開發期監控+線上上報”的雙軌機制,持續迭代優化策略,在功能完整性與存儲效率間找到最佳平衡。

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

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

相關文章

AJAX-讓數據活起來(一):入門

目錄 一、AJAX概念和axios使用 1.1 什么是AJAX ? 1.2 怎么用AJAX ? 1.3 axios使用 二、認識URL 2.1 什么是URL? 2.2 URL的組成 組成 協議 域名 資源路徑 獲取-新聞列表 三、URL查詢參數 URL查詢參數 axios - 查詢參數 四、常用請求方法和數據提交 常用請求…

【C++篇】list模擬實現

實現接口&#xff1a; list的無參構造、n個val構造、拷貝構造 operator重載 實現迭代器 push_back() push_front() erase() insert() 頭尾刪 #pragma once #include<iostream> #include<assert.h> using namespace std;namespace liu {//定義list節點temp…

Go 語言范圍循環變量重用問題與 VSCode 調試解決方法

文章目錄 問題描述問題原因1. Go 1.21 及更早版本的范圍循環行為2. Go 1.22 的改進3. VSCode 調試中的問題4. 命令行 dlv debug 的正確輸出 三種解決方法1. 啟用 Go 模塊2. 優化 VSCode 調試配置3. 修改代碼以確保兼容性4. 清理緩存5. 驗證環境 驗證結果結論 在 Go 編程中&…

快速創建 Vue 3 項目

安裝 Node.js 和 Vue CL 安裝 Node.js&#xff1a;訪問 https://nodejs.org/ 下載并安裝 LTS 版本。 安裝完后&#xff0c;在終端檢查版本&#xff1a; node -v npm -v安裝 Vue CLI&#xff08;全局&#xff09;&#xff1a; npm install -g vue/cli創建 Vue 3 項目 vue cr…

java學習日志——Spring Security介紹

使用Spring Security要重寫UserDetailsService的loadUserByUsername方法&#xff08;相當于自定了認證邏輯&#xff09;

【C++進階篇】初識哈希

哈希表深度剖析&#xff1a;原理、沖突解決與C容器實戰 一. 哈希1.1 哈希概念1.2 哈希思想1.3 常見的哈希函數1.3.1 直接定址法1.3.2 除留余數法1.3.3 乘法散列法&#xff08;了解&#xff09;1.3.4 平方取中法&#xff08;了解&#xff09; 1.4 哈希沖突1.4.1 沖突原因1.4.2 解…

單機Kafka配置ssl并在springboot使用

目錄 SSL證書生成根證書生成服務端和客戶端證書生成keystore.jks和truststore.jks輔助腳本單獨生成truststore.jks 環境配置hosts文件kafka server.properties配置ssl 啟動kafkakafka基礎操作springboot集成準備工作需要配置的文件開始消費 SSL證書 證書主要包含兩大類&#x…

PCB設計教程【入門篇】——電路分析基礎-元件數據手冊

前言 本教程基于B站Expert電子實驗室的PCB設計教學的整理&#xff0c;為個人學習記錄&#xff0c;旨在幫助PCB設計新手入門。所有內容僅作學習交流使用&#xff0c;無任何商業目的。若涉及侵權&#xff0c;請隨時聯系&#xff0c;將會立即處理 目錄 前言 一、數據手冊的重要…

Vue2實現Office文檔(docx、xlsx、pdf)在線預覽

&#x1f31f; 前言 歡迎來到我的技術小宇宙&#xff01;&#x1f30c; 這里不僅是我記錄技術點滴的后花園&#xff0c;也是我分享學習心得和項目經驗的樂園。&#x1f4da; 無論你是技術小白還是資深大牛&#xff0c;這里總有一些內容能觸動你的好奇心。&#x1f50d; &#x…

【辰輝創聚生物】JAK-STAT信號通路相關蛋白:細胞信號傳導的核心樞紐

在細胞間復雜的信號傳遞網絡中&#xff0c;Janus 激酶 - 信號轉導和轉錄激活因子&#xff08;JAK-STAT&#xff09;信號通路猶如一條高速信息公路&#xff0c;承擔著傳遞細胞外信號、調控基因表達的重要使命。JAK-STAT 信號通路相關蛋白作為這條信息公路上的 “關鍵節點” 和 “…

OceanBase數據庫從入門到精通(運維監控篇)

文章目錄 一、OceanBase 運維監控體系概述二、OceanBase 系統表與元數據查詢2.1 元數據查詢基礎2.2 核心系統表詳解2.3 分區元數據查詢實戰三、OceanBase 性能監控SQL詳解3.1 關鍵性能指標監控3.2 SQL性能分析實戰四、OceanBase 空間使用監控4.1 表空間監控體系4.2 空間使用趨勢…

linux 進程間通信_共享內存

目錄 一、什么是共享內存&#xff1f; 二、共享內存的特點 優點 缺點 三、使用共享內存的基本函數 1、創建共享內存shmget() 2、掛接共享內存shmat 3、脫離掛接shmdt 4、共享內存控制shmctl 5.查看和刪除共享內存 comm.hpp server.cc Client.cc Makefile 一、什么…

Spring Boot 登錄實現:JWT 與 Session 全面對比與實戰講解

Spring Boot 登錄實現&#xff1a;JWT 與 Session 全面對比與實戰講解 2025.5.21-23:11今天在學習黑馬點評時突然發現用的是與蒼穹外賣jwt不一樣的登錄方式-Session&#xff0c;于是就想記錄一下這兩種方式有什么不同 在實際開發中&#xff0c;登錄認證是后端最基礎也是最重要…

Vue中的 VueComponent

VueComponent 組件的本質 Vue 組件是一個可復用的 Vue 實例。每個組件本質上就是通過 Vue.extend() 創建的構造函數&#xff0c;或者在 Vue 3 中是由函數式 API&#xff08;Composition API&#xff09;創建的。 // Vue 2 const MyComponent Vue.extend({template: <div…

使用 FFmpeg 將視頻轉換為高質量 GIF(保留原始尺寸和幀率)

在制作教程動圖、產品展示、前端 UI 演示等場景中,我們經常需要將視頻轉換為體積合適且清晰的 GIF 動圖。本文將詳細介紹如何使用 FFmpeg 工具將視頻轉為高質量 GIF,包括: ? 保留原視頻尺寸或自定義縮放? 保留原始幀率或自定義幀率? 使用調色板優化色彩質量? 降低體積同…

【自然語言處理與大模型】大模型Agent四大的組件

大模型Agent是基于大型語言模型構建的智能體&#xff0c;它們能夠模擬獨立思考過程&#xff0c;靈活調用各類工具&#xff0c;逐步達成預設目標。這類智能體的設計旨在通過感知、思考與行動三者的緊密結合來完成復雜任務。下面將從大模型大腦&#xff08;LLM&#xff09;、規劃…

《軟件工程》第 11 章 - 結構化軟件開發

結構化軟件開發是一種傳統且經典的軟件開發方法&#xff0c;它強調將軟件系統分解為多個獨立的模塊&#xff0c;通過數據流和控制流來描述系統的行為。本章將結合 Java 代碼示例、可視化圖表&#xff0c;深入講解面向數據流的分析與設計方法以及實時系統設計的相關內容。 11.1 …

初步嘗試AI應用開發平臺——Dify的本地部署和應用開發

隨著大語言模型LLM和相關應用的流行&#xff0c;在本地部署并構建知識庫&#xff0c;結合企業的行業經驗或個人的知識積累進行定制化開發&#xff0c;是LLM的一個重點發展方向&#xff0c;在此方向上也涌現出了眾多軟件框架和工具集&#xff0c;Dify就是其中廣受關注的一款&…

高階數據結構——哈希表的實現

目錄 1.概念引入 2.哈希的概念&#xff1a; 2.1 什么叫映射&#xff1f; 2.2 直接定址法 2.3 哈希沖突&#xff08;哈希碰撞&#xff09; 2.4 負載因子 2.5 哈希函數 2.5.1 除法散列法&#xff08;除留余數法&#xff09; 2.5.2 乘法散列法&#xff08;了解&#xff09…

7.安卓逆向2-frida hook技術-介紹

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 內容參考于&#xff1a;圖靈Python學院 工具下載&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取碼&#xff1…