1. 程式人生 > >python和java的區別(python記憶體管理)

python和java的區別(python記憶體管理)

1.Java編譯以後才能執行,Python(指令碼語言)直接就可以執行;

Python語法更簡潔
一個完整的Python HelloWorld程式只要一行程式碼:

print("Hello World")
一個完整的Java HelloWorld需要幾行程式碼:
public class HelloWorld {
	public static void main(String[] args) {
		System.out.println("Hello World");
	}
}
Python的優勢是入門快、開發效率高,寫法靈活。

Python是一門動態強型別語言
Python變數名只是一個名字而已,而該變數所繫結的物件在物件建立初期就確定好了型別的

,你永遠也不可能再改變其型別,因此Python是強型別語言。而Java是一門靜態強型別語言(變數必須宣告型別)。
Python中一切皆是物件
在Python中,不論是數值(整型、浮點型),字串,字典,元組物件,還是他們所對應的型別,以及函式,模組等你所能看到的都是物件,他們的祖先是PyObject。而Java中至少函式,基本資料型別都不算物件。
Python的GIL(缺點)
Python中的GIL一直被不少開發者所詬病,GIL是指全域性解釋鎖,Python的多執行緒在多CPU條件下並不能並行的執行,而只能是每個執行緒執行的時候首先需要獲得直譯器的訪問許可權才可以執行,其他執行緒只能處於等待的過程,不過GIL並不是Python的致命缺點,否則現在沒人會用的,因為有很多方案是協程,或者是用多程序機制來彌補。而Java支援真正的多執行緒併發操作,能很好的控制資源的的共享。

Python是如何進行記憶體管理的?

答:從三個方面來說,一物件的引用計數機制,二垃圾回收機制,三記憶體池機制
一、物件的引用計數機制(Python的垃圾收集機制主要使用的引用計數方式
python內部使用引用計數Python的垃圾收集機制主要使用的引用計數方式
,來保持追蹤記憶體中的物件,所有物件都有引用計數。

引用計數增加的情況:
1,一個物件分配一個新名稱
2,將其放入一個容器中(如列表、元組或字典)
引用計數減少的情況:
1,使用del語句對物件別名顯示的銷燬
2,引用超出作用域或被重新賦值
sys.getrefcount( )函式可以獲得物件的當前引用計數
多數情況下,引用計數比你猜測得要大得多。對於不可變資料(如數字和字串),直譯器會在程式的不同部分共享記憶體,以便節約記憶體。


二、垃圾回收
1,當一個物件的引用計數歸零時,它將被垃圾收集機制處理掉。
2,當兩個物件a和b相互引用時,del語句可以減少a和b的引用計數,並銷燬用於引用底層物件的名稱。然而由於每個物件都包含一個對其他物件的應用,因此引用計數不會歸零,物件也不會銷燬。(從而導致記憶體洩露)。為解決這一問題,直譯器會定期執行一個迴圈檢測器,搜尋不可訪問物件的迴圈並刪除它們。
三、記憶體池機制
Python提供了對記憶體的垃圾收集機制,但是它將不用的記憶體放到記憶體池而不是返回給作業系統。
1,Pymalloc機制。為了加速Python的執行效率,Python引入了一個記憶體池機制,用於管理對小塊記憶體的申請和釋放。
2,Python中所有小於256個位元組的物件都使用pymalloc實現的分配器,而大的物件則使用系統的malloc。
3,對於Python物件,如整數,浮點數和List,都有其獨立的私有記憶體池,物件間不共享他們的記憶體池。也就是說如果你分配又釋放了大量的整數,用於快取這些整數的記憶體就不能再分配給浮點數。