2017-07-28 14 views
3

私はエビでPDFファイルを作成し、このように、ActionControllerのSEND_DATAを使用して、ユーザーに送信Railsのアプリ(5.0.4、Rubyの2.3.3)を構築しています:なぜsend_dataで送信されたオブジェクトはメモリ内に保持されているようですか?

# data is a Prawn document  
send_data data, type: 'application/pdf', disposition: 'inline', filename: 'document.pdf' 

私は」ヘロクには、作成され、送信される各ドキュメントで、アプリケーションがますます多くのメモリを使用しているように見えることに気付いた。私はいくつかの原油テストで私のローカルマシンでこれを確認しました。今、send_dataコールの後にGC.startを配置しましたが、問題は解決しているようです。メモリは常に安定したレベルに戻ります。

私の質問は、send_dataですか?また、ガベージコレクタは時折「単独で」動作するはずですか? Herokuは安定した記憶増加を示します。ありがとうございました。

答えて

2

GCは、システムが多少のメモリ圧迫下にあるとき、特にheap_free_slotsが使い果たされたときにのみ実行されます。 GC.statで利用可能な数を確認できます。あなたはそれを使い果たすまで使用されたメモリを支払うのではないので、スペースを早めに解放しようとするのはほとんどありません。その後、ほとんどのスペースは、ガベージコレクタの最小限の呼び出しで再利用できます。

+1

ありがとうございます。 GC.startを呼び出さずに実行すると、プロセスは数MBのメモリを解放することに気付いたので、GCが自動的にその処理を行っていると仮定しましたが、呼び出すときにメモリを解放するようには見えませんそれは明白です。私は、 "auto GC"が "light mode"で実行されていると仮定しています。これに関する更なる明確化/確認は、再度認められます。 – flavio

+2

はい、それは "マイナー"モードで動作します。明示的に呼び出すと、それは第2世代のGCオブジェクトでもある「メジャー」モードで実行されます。それに関する素晴らしい記事はこちら:https://www.speedshop.co/2017/03/09/a-guide-to-gc-stat.html – Segfault

関連する問題