在GAE上,我的處理函數調用一個完成所有繁重工作的函數。所有的對象都是在函數中創建的。但是,在函數退出後(它爲response.out.write返回一個字符串),內存使用量不會下降。對GAE的第一次http呼叫有效,但之後內存保持在大約100MB。第二次訪問嘗試失敗,因爲已達到私人內存限制。爲什麼函數返回後內存不能被釋放?
我已經清除了我編寫的所有類靜態對象,並且無效地調用了第三方庫的close和clear函數。如何幹淨地釋放內存?我寧願強制重啓而不是追蹤內存泄漏。性能不是問題。
我知道這不是由於GC導致的。 GAE報告說,記憶長時間保持高水平。上面的兩個http調用被分隔或更長。
我試過在Handler.get函數中導入我的函數。在提供頁面之後,我嘗試刪除所有導入的第三方模塊,然後刪除我自己的模塊。從理論上講,每次調用都應該重新啓動所有可疑模塊,但內存問題仍然存在。調用之間留下的唯一(預期的)模塊應該是標準庫模塊(包括lxml,xml等)。
編輯: 我現在使用taskqueue來安排後端實例上的重型部件,並使用db.Blob來傳遞結果。獲得後端工作解決了內存問題。後端的GAE文檔已完成,但令人困惑。關鍵是需要遵循1)編輯backends.yaml的指示2)使用appcfg進行更新(從啓動器部署是不夠的)。之後檢查管理員後端是否已啓動。此外,taskqueue target =在開發服務器上中斷,因此需要在開發服務器上解決它。