內存溢出:你申請了10個字節的內存,但寫入了大於10個字節的數據會致使內存溢出html
內存溢出緣由:
1.內存中加載的數據量過於龐大,如一次從數據庫取出過多數據;
2.集合類中有對對象的引用,使用完後未清空,產生了堆積,使得JVM不能回收;
3.代碼中存在死循環或循環產生過多重複的對象實體;
4.使用的第三方軟件中的BUG;
5.啓動參數內存值設定的太小
內存溢出的解決方案:
第一步,修改JVM啓動參數,直接增長內存。(-Xms,-Xmx參數必定不要忘記加。)python
第二步,檢查錯誤日誌,查看「OutOfMemory」錯誤前是否有其 它異常或錯誤。git
第三步,對代碼進行走查和分析,找出可能發生內存溢出的位置。github
參考地址:https://blog.csdn.net/qq_43004728/article/details/84869354數據庫
內存管理函數
包括:操作系統
python中, 變量在第一次被賦值時自動聲明, 和其它語言同樣, 變量只有被建立和賦值後才能被使用.net
變量名無須事先聲明, 也無須類型聲明
對象的類型和內存佔用都是運行時肯定的設計
python解釋器會自動進行內存管理, 不用開發人員去關心日誌
當對象的引用被銷燬時, 引用計數會減小, 明顯的例子就是當引用離開其做用範圍時, 這種狀況最常常出如今函數運行結束時, 全部局部變量都被自動銷燬, 對象的引用計數也就減小
再也不被使用的內存會被一種稱爲垃圾收集的機制釋放
注: 解釋器跟蹤對象的引用計數, 垃圾回收機制負責釋放內存, 垃圾收集器是一塊獨立代碼, 它用來尋找引用計數爲0的對象, 它也負責檢查雖然引用計數大於0可是也應該被銷燬的對象
引用語義
: python中在變量裏保存值(對象)的引用, 採用這種方式, 變量所需的存儲空間大小一致, 由於其只須要保存一個引用值語義
變量的值直接保存在變量的存儲區裏, 這樣一個整數類型的變量就須要保存一個整數所需的空間, 一個浮點數變量就須要足夠的空間存儲一個浮點數. C中就是值語義參考地址:https://www.cnblogs.com/qlshine/p/5986132.html
內存管理機制:引用計數、垃圾回收、內存池。
1、引用計數:
引用計數是一種很是高效的內存管理手段, 當一個 Python 對象被引用時其引用計數增長 1, 當其再也不被一個變量引用時則計數減 1. 當引用計數等於 0 時對象被刪除。
2、垃圾回收 :
1. 引用計數
引用計數也是一種垃圾收集機制,並且也是一種最直觀,最簡單的垃圾收集技術。當 Python 的某個對象的引用計數降爲 0 時,說明沒有任何引用指向該對象,該對象就成爲要被回收的垃圾了。好比某個新建對象,它被分配給某個引用,對象的引用計數變爲 1。若是引用被刪除,對象的引用計數爲 0,那麼該對象就能夠被垃圾回收。不過若是出現循環引用的話,引用計數機制就再也不起有效的做用了
2. 標記清除
若是兩個對象的引用計數都爲 1,可是僅僅存在他們之間的循環引用,那麼這兩個對象都是須要被回收的,也就是說,它們的引用計數雖然表現爲非 0,但實際上有效的引用計數爲 0。因此先將循環引用摘掉,就會得出這兩個對象的有效計數。
3. 分代回收
從前面「標記-清除」這樣的垃圾收集機制來看,這種垃圾收集機制所帶來的額外操做實際上與系統中總的內存塊的數量是相關的,當須要回收的內存塊越多時,垃圾檢測帶來的額外操做就越多,而垃圾回收帶來的額外操做就越少;反之,當需回收的內存塊越少時,垃圾檢測就將比垃圾回收帶來更少的額外操做。
3、內存池:
1. Python 的內存機制呈現金字塔形狀, -1, -2 層主要有操做系統進行操做;
2. 第 0 層是 C 中的 malloc, free 等內存分配和釋放函數進行操做;
3. 第 1 層和第 2 層是內存池,有 Python 的接口函數 PyMem_Malloc 函數實現,當對象小於256K 時有該層直接分配內存;
4. 第 3 層是最上層,也就是咱們對 Python 對象的直接操做;Python 在運行期間會大量地執行 malloc 和 free 的操做,頻繁地在用戶態和核心態之間進行切換,這將嚴重影響 Python 的執行效率。爲了加速 Python 的執行效率, Python 引入了一個內存池機制,用於管理對小塊內存的申請和釋放。Python 內部默認的小塊內存與大塊內存的分界點定在 256 個字節,當申請的內存小於 256 字節時, PyObject_Malloc 會在內存池中申請內存;當申請的內存大於 256 字節時, PyObject_Malloc 的行爲將蛻化爲 malloc 的行爲。固然,經過修改 Python 源代碼,咱們能夠改變這個默認值,從而改變 Python 的默認內存管理行爲。
4、調優手段
1.手動垃圾回收
2.調高垃圾回收閾值
3.避免循環引用
參考地址:https://blog.csdn.net/u011692780/article/details/81427527
什麼是內存泄漏?
內存泄露指因爲疏忽或錯誤形成程序未能釋放已經再也不使用內存的狀況。內存泄露並不是指內存在物理上的消失,而是應用程序分配某段內存後,因爲設計錯誤,失去了對該段內存的控制,於是形成了內存的浪費,致使運行速度緩慢甚至系統崩潰等嚴重後果。
那應該如何避免呢?
有_del_()函數的對象間的循環引用是致使內存泄露的主兇。
參考地址:https://blog.csdn.net/qq_43192617/article/details/87468242