メモリ使用量:
プログラムの動作中にメモリ空間を必要とするメモリ空間の定義された変数を必要とするようなオブジェクトを作成すると、メモリ空間を開放する必要があります。これは、メモリを開いたが、また、そこには、メモリを解放するためにバインドされ、それ以外の場合は、まだだけで勇敢にないですか?まだリリースしてそこに開かれる場合でも、短期記憶におけるごみがあります。
メモリ管理:
、メモリと回復は典型的な例は、C言語で、いくつかの言語ではオープンコードで実行する必要があります。C言語では、メモリを開い:PTR =(int型*)のmalloc(はsizeof(int型)* n)で、メモリのブロックの解除:無料(PTR);このプロセスがどのように行うにホイールなし(使用中のメモリの前にプログラムに記述する必要があります、私たち自身の意思)。そして、Java言語のこの種のPythonのメモリは、バックグラウンドでのガベージコレクションのGCの責任のメカニズムが存在し、かつ回復コードの実装を開く必要はありません。
2で使用するPythonのガベージコレクションのメカニズム:
1.参照カウント、マークをクリア
2.世代間の回復
参照カウント、マークをクリア
すべてのものは、構造のコアであるオブジェクトは、あるパイソン:PyObject
struct_objectのtypedef {
INT ob_refcnt。
struct_typeobject * ob_type。
} PyObject。
PyObjectは、各オブジェクトが参照カウントとして使用されるob_refcntコンテンツを持っている必要があります。新しいオブジェクトが参照されると、それが参照されるオブジェクトが削除されたとき、それはob_refcntを削減する、ob_refcntを増加します
#define Py_INCREF(OP)((OP) - > ob_refcnt ++)// インクリメントカウント
の#define Py_DECREF(OP)\ // 、カウントをデクリメント
IF( - (OP) - > ob_refcnt =!0 )\
; \
他の\の
__Py_Dealloc( (PyObject *)(OP))
あなたがオブジェクトを作成するとob_refcnt値のCのPythonオブジェクト構造を1にセットした状態で、すぐに、オペレーティングシステムにPythonのメモリを要求します。
変数の再割り当ては、可変の場合は、新しいオブジェクトを指す場合は、新しいオブジェクトが基準値1であり、オブジェクトの参照カウントの古い値は0に設定されます。
Pythonのガベージコレクションのメカニズムが0のカウントメモリ・オブジェクトの参照値を見つけたとき、それはそれ自身のデビューことが判明しました。ガベージコレクションは、メモリを解放し、オブジェクトを破壊します。
参照カウントは、明確なマークこのトリックは非常に有効であり、回復オブジェクトのほとんどを解決することができます。しかし、そこにいくつかのケースでは、この動きは解決できないということであり、それはある循環参照。いわゆるサイクルアプリケーションが2つのオブジェクトが相互に参照し、島となったことを意味し、他のオブジェクトに関連付けられていません。
それが引用されているため、この場合、参照カウントは、いいえ「tommorr」解放したいと考え、常に1である「別の」最初の「別の」「tommor」を使用するのリリースが、「他人tommorrされているので、リファレンスは、解放することができません。これはそれを行う方法です?そして、リサイクルのための世代間セカンドランのためのPythonのガベージコレクションのメカニズムが必要です。
世代間の回復
メイン世代間収集機構3つのトリック:
第一:所有创建的对象都会加入到零代链表中,并扫描零代链表中所有的循环引用。如图发现两个对象的循环引用。
第二:将发现的循环引用的引用计数都减1。
当循环引用计数值为0之后,就被标记清除,垃圾回收第一规则就生效。如果清除一次引用计数还不为0咋办呢?那就是第三步
第三步:将零代中引用计数不为0的对象加入到一代链表中,在一代链表中会重复零代中的循环计数减1操作。同时如果生命力顽强到一代链表都没处理的,那么会加入到二代链表。
以上讲到的是垃圾回收机制的大体思路,其实python的垃圾回收机制比以上描述的要复杂很多,很多深奥的东西可以看篇文章:https://www.cnblogs.com/pinganzi/p/6646742.html