python的內存管理機制

目錄

  • 內存分配方式
    • 自動內存管理
    • 內存分配策略
  • 垃圾回收機制
    • 引用計數垃圾回收
      • 對象創建和引用關系
      • 引用計數的狀態
      • 刪除變量
    • 標記 - 清除垃圾回收
  • 內存分配的區域劃分
    • 棧內存
    • 堆內存
  • 內存管理的優化
    • 內存池技術
    • 對象共享

Python 的內存管理機制是其運行效率和安全性的重要保障,主要包括以下幾個方面:

內存分配方式

自動內存管理

  • Python 采用自動內存管理,主要通過垃圾回收機制來實現。它不需要程序員手動釋放內存【典型的例子C和C++,使用malloc和free等函數】,大大減少了內存泄漏等錯誤的發生。例如,在 Python 中創建一個列表對象:
    my_list = [1, 2, 3]
    
    當這個列表不再被任何變量引用時,Python 的垃圾回收機制會自動回收它所占用的內存。
  • 這種自動管理方式使得程序員可以更專注于程序邏輯的實現,而不是內存管理的細節。

內存分配策略

  • Python 使用引用計數作為主要的內存分配策略。每個對象都有一個引用計數器,當一個對象被創建時,它的引用計數器被設置為 1。例如:
    a = 10
    
    此時,整數對象 10 的引用計數為 1。
  • 當一個對象被賦值給另一個變量時,引用計數會增加。例如:
    b = a
    
    整數對象 10 的引用計數變為 2。
  • 當一個對象被刪除或者其引用被重新賦值給其他對象時,引用計數會減少。例如:
    del a
    
    整數對象 10 的引用計數變為 1。當引用計數變為 0 時,Python 的垃圾回收機制就會回收該對象所占用的內存。

垃圾回收機制

引用計數垃圾回收

  • 這是 Python 最主要的垃圾回收方式。如前面所述,通過引用計數來判斷對象是否還有用。這種方式的優點是簡單高效,能夠及時回收不再使用的對象。例如,一個復雜的嵌套數據結構,當它的頂層變量被刪除后,其內部所有對象的引用計數都會逐漸減少,一旦變為 0 就會被回收。
  • 但是引用計數也有缺點,它無法處理循環引用的情況。例如:
    a = []
    b = []
    a.append(b)
    b.append(a)
    
  • 循環引用是指兩個或多個對象之間互相引用,形成一個閉環。這種情況下,即使這些對象沒有被外部變量引用【a 中的元素(即 b)和 b 中的元素(即 a)是內部的引用關系,這些引用關系是對象內部的結構,而不是外部變量的直接引用】,它們的引用計數也不會為0,因為它們互相引用。

對象創建和引用關系

  • a = [] 創建了一個空列表對象 a,此時 a 的引用計數為 1(a 本身引用了它)。
  • b = [] 創建了另一個空列表對象 b,此時 b 的引用計數也為 1(b 本身引用了它)。
  • a.append(b) 將對象 b 添加到列表 a 中,此時 b 的引用計數增加 1,變為 2(b 本身和 a 中的元素引用了它)。
  • b.append(a) 將對象 a 添加到列表 b 中,此時 a 的引用計數也增加 1,變為 2(a 本身和 b 中的元素引用了它)。

引用計數的狀態

現在,ab 的引用計數都是 2:

  • aa 本身和 b 中的元素引用。
  • bb 本身和 a 中的元素引用。

刪除變量

假設我們執行以下操作:

del a
del b
  • 刪除變量 a 后,a 的引用計數減少 1,變為 1(只剩下 b 中的元素引用它)。
  • 刪除變量 b 后,b 的引用計數也減少 1,變為 1(只剩下 a 中的元素引用它)。

此時,ab 的引用計數仍然為 1,因為它們互相引用。即使我們刪除了外部變量 ab,它們的引用計數也不會變為 0,因此引用計數機制無法回收它們。

標記 - 清除垃圾回收

  • 為了處理循環引用的問題,Python 還采用了標記 - 清除垃圾回收機制。該機制會定期運行,它從根對象集合(如全局變量、棧中的變量等)開始,標記所有可達的對象。然后掃描整個內存堆,將未標記的對象視為垃圾進行回收。
  • 例如,在上述循環引用的例子中,當標記 - 清除機制運行時,它會發現 a 和 b 之間雖然互相引用,但它們沒有被根對象【在 Python 的垃圾回收機制中,根對象是指那些始終被程序直接引用的對象;例如:全局變量、局部變量、活動對象、內置對象等】集合引用,所以會被標記為垃圾并回收。

內存分配的區域劃分

棧內存

  • 主要用于存儲局部變量、函數調用的上下文等。在 Python 中,當一個函數被調用時,會為其創建一個棧幀,棧幀中包含了函數的局部變量等信息。例如:
    def my_function():x = 10y = 20return x + y
    
    當調用 my_function() 時,會創建一個棧幀,其中存儲了變量 x 和 y。棧內存的分配和釋放速度很快,當函數調用結束時,棧幀會被銷毀,其中的變量占用的內存也會被釋放。

堆內存

  • 主要用于存儲對象實例等。例如,創建一個類的實例:
    class MyClass:def __init__(self, value):self.value = value
    obj = MyClass(100)
    
    這里的 obj 是一個對象實例,它存儲在堆內存中。堆內存的分配和釋放相對復雜,需要通過垃圾回收機制來管理。

內存管理的優化

內存池技術

  • Python 的內存管理使用了內存池技術。內存池是一種預先分配一塊較大的內存空間,然后從這個空間中分配小塊內存給對象的技術。例如,對于小整數(通常在 -5 到 256 之間),Python 會預先分配好這些整數對象存儲在內存池中,當程序需要使用這些小整數時,直接從內存池中獲取,避免了頻繁的內存分配和釋放操作,提高了內存分配的效率。

對象共享

  • Python 會盡量共享一些不可變對象。例如,字符串對象在某些情況下會共享。如果程序中有多個地方使用相同的字符串,Python 會盡量讓它們指向同一個字符串對象,而不是創建多個相同的字符串對象,這樣可以節省內存空間。

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

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

相關文章

火山引擎coze用戶市場

火山引擎 **Coze**(扣子)的用戶市場主要集中在 **需要快速構建和部署智能對話應用的企業及開發者群體**,覆蓋多個行業與場景。以下是具體分析: --- ### **一、核心用戶群體** 1. **企業用戶** - **互聯網/科技公司**&#…

Java 責任鏈模式 詳解

責任鏈模式詳解 一、責任鏈模式概述 責任鏈模式(Chain of Responsibility Pattern)是一種行為型設計模式,它允許你將請求沿著處理鏈傳遞,直到有一個處理者能夠處理它為止。這種模式解耦了請求的發送者和接收者,使多個對象都有機會處理請求。…

【C++初階】--- string類

1.STL簡介 STL(standard template libaray-標準模板庫):是C標準庫的重要組成部分,不僅是一個可復用的組件庫,而且是一個包羅數據結構與算法的軟件框架。 2.string類 2.1什么是string類 std::string 類是 C 標準庫中用于處理和操作字符串…

Ubuntu 20.04 中 Git 的安裝、配置和基本操作指南

本文為經驗 所談 使用版本為ubuntu20.04 1 ubuntu的git初始化 1.安裝git sudo apt-get install git 可通過git --version 命令查看,正常輸出git版本號即安裝成功。 2.配置用戶名和郵箱名 git config --global user.name "Your Name" git config --globa…

conda 激活環境vscode的Bash窗口

多份conda環境注意事項,當時安裝了兩個conda環境,miniconda和conda,導致環境總是沖突矛盾。初始化時需要更加注意。 $ C:/Users/a_hal/miniconda3/Scripts/conda.exe init bash能夠顯示用哪里的conda環境命令執行。 然后直接conda activate…

Mac下小智AI本地環境部署

可以進行聊天、編寫程序、播放歌曲等等的小智語音聊天小助手,在Mac環境下修改源代碼,值得擁有。本篇內容主要講解Mac下環境的搭建,WebSocket的修改。注:環境python3.12.0、ESP-IDF5.4.0、開發板ESP32S3。 目錄 1.Git安裝2.Python…

Linux安裝Cmake (Centos 7.9)

cmake安裝 這個雖然已經更新到了4.0.0版本了,但是我們要用3.5版本的,因為這個比較穩定 官方地址:https://github.com/Kitware/CMake/releases/tag/v3.5.0,選擇那個cmake-3.5.0-Linux-x86_64.tar.gz下載, 首先解壓文…

基于 SpringBoot 的舊物置換網站

收藏關注不迷路!! 🌟文末獲取源碼數據庫🌟 感興趣的可以先收藏起來,還有大家在畢設選題(免費咨詢指導選題),項目以及論文編寫等相關問題都可以給我留言咨詢,希望幫助更多…

ELK 通過 logstash 收集單個/多個日志文件

一、收集單個日志文件 注意事項: logstah 服務默認啟動用戶和組是 logstash被收集的日志文件有讀的權限并對寫入的文件有寫權限而 logstash 是普通用戶 1.1 編輯 logstash 配置文件 vim /etc/logstash/conf.d/test.conf input {file {path > "/var/log/…

分享一個Drools規則引擎微服務Docker部署

通常我們都是把Drools作為嵌入式使用,但在微服務泛濫時代,還在老套的嵌入式顯然不符合微服務架構要求,本文分享一個把Drools作為微服務獨立部署的方案。 本方案基于Drools引擎微服務,提供REST接口。 1、可以動態部署Drools規則2…

Mac 本地化部署 dify

Macbook 本地化部署 dify 目錄 Macbook 本地化部署 dify安裝dockerdocker下載地址 安裝dify下載dify到本地github可能遇到的問題: github打開超時在本地解壓dify.zip文件本地化部署docker部署可能遇到的問題: 部署超時登錄體驗 dify 安裝docker docker下載地址 根據電腦芯片選…

串口中斷接收與環形緩沖實例(apollo3 blue plus)

#define DEV_UART1 1 #define GPS_POWER_PIN 13 #define GPS_LOG_ENABLE 1 #define MAX_UART1_SIZE 1024 #define AM_BSP_GPIO_COM_UART1_TX 8 #define AM_BSP_GPIO_COM_UART1_RX 9 // 定義環形緩沖區結構 typed…

操作系統高頻(五)linux命令

操作系統高頻(五)linux命令 1.Linux中查看進程運行狀態的指令、tar解壓文件的參數。??? 在Linux中,可以使用以下指令查看進程的運行狀態: top: 用于實時監視系統的進程活動和系統資源使用情況。在終端中運行top…

Spring Boot 快速入手

前言:為什么選擇 Spring Boot? 🚀 在現代 Java 開發中,Spring Boot 已成為最流行的后端框架之一。無論是小型 Web 應用、企業級系統,還是微服務架構,Spring Boot 都能提供快速開發、自動配置、輕量級部署的…

oracle-blob導出,在ob導入失敗

導出&#xff1a; [oraclelncs dmp]$ /home/oracle/sqluldr2 gistar/res#pwd192.168.205.58:1521/lndb query"select * from an_odn_picture where length(PIC_CONTENT)<25000" filean_odn_picture.csv Charsetutf8 textCSV 0 rows exported at 2025-…

RK3568 pinctrl內容講解

文章目錄 一、pinctrl的概念`pinctrl` 的作用設備樹中的 `pinctrl` 節點典型的 `pinctrl` 節點結構例子`pinctrl` 的重要性總結二、RK3568的pinctrl講解1. `pinctrl` 節點2. `gpio0` 至 `gpio4` 子節點每個 `gpioX` 子節點的結構和作用3. `gpio1` 到 `gpio4` 子節點總結1. `aco…

北京南文觀點:后糖酒會營銷,以戰略傳播重構品牌信心坐標

第112屆全國糖酒會落下帷幕&#xff0c;參展品牌面臨一個關鍵命題。如何在流量洪流中沉淀品牌價值&#xff1f;北京南文&#xff08;全稱&#xff1a;南文樂園科技文化&#xff08;北京&#xff09;有限公司&#xff09;認為&#xff0c;糖酒會的結束恰是算法時代品牌認知戰的真…

html5時鐘升級!支持切換深淺模式 Canvas實現現代化動態時鐘

HTML5 Canvas實現現代化動態時鐘 這里寫目錄標題 HTML5 Canvas實現現代化動態時鐘項目介紹技術實現1. 項目架構2. Canvas繪圖實現2.1 表盤繪制2.2 刻度繪制2.3 指針繪制 3. 動畫效果4. 主題切換 項目亮點技術要點總結項目收獲改進方向結語 項目介紹 本項目使用HTML5 Canvas技術…

《SRv6 網絡編程:開啟IP網絡新時代》第2章、第3章:SRv6基本原理和基礎協議

背景 根據工作要求、本人掌握的知識情況&#xff0c;僅針對《SRv6 網絡編程&#xff1a;開啟IP網絡新時代》書籍中涉及的部分知識點進行總結梳理&#xff0c;并與工作小組進行分享&#xff0c;不涉及對原作的逐字搬運。 問題 組內同事提出的問題&#xff1a;本文缺擴展頭描述…

衛星電話究竟是“錦上添花”?還是“剛需之選”?

在萬物互聯的時代浪潮中&#xff0c;衛星電話究竟是可有可無的“錦上添花”&#xff0c;還是至關重要的“剛需之選”&#xff1f;隨著通信技術的持續進步與應用場景的日益拓展&#xff0c;這一問題的答案正逐漸明晰。 在5G基站覆蓋99%行政村的今天&#xff0c;人類依然要直面自…