



TopMemoryContext:整個內存上下文樹的根節點,每一個申請的內存上下文都直接或間接的是TopMemoryContext的孩子節點,在這個上下文上申請的內存基本等價于malloc,因為這個上下文不會被重置或被刪除。所以在這個上下文中應該保存不會釋放的內容或者申請者要負責對申請內存的釋放。
CacheMemoryContext:永久緩存系統表元組catcache和表模式信息relcache,所以這個上下文不會刪除和重置,把他和TopMemoryContext區分開是為了便于調試。
MessageContext:上下文保存著當前執行的sql指令相關的內存,這個上下文的生命周期和當前指令相同,在PostgresMain每一次循環周期中被重置。
TopTransactionContext:這個上下文持續整個頂層事物的生命周期,當頂層事物結束時這個上下文會釋放掉,大多數情況下不應該在這里直接申請內存,應該在CurTransactionContext中申請。對于跨多個子事物的一些控制信息應該保存在這里。
CurTransactionContext:當我們在頂級事物中時,指向TopTransactionContext。但是當我們在一個子事物時,他指向一個child context。
如果這個子事物終止了,那么在完成abort操作之后,這個上下文就會被釋放掉。注意所有和這個事物相關的指針調用都要清理,因為這部分內存已經釋放掉了,如果繼續調用的話會crash。
如果這個子事物提交了,那個這個上下文會一直保存直到頂層事物提交,這樣保證了如果子事物失敗了,他使用的內存會被立即釋放。
ErrorContext:這也是一個永久存在的上下文,錯誤恢復過程中會使用這個上下文,在任何時刻這個上下文都有8K的空間,這樣可以保證在內存耗盡時仍然可以執行相關的處理動作。
???t?l?|?