Ruby on Rails開発のインターン (Day 8)
こんにちは、皆さん!
今日は急用があって、1時間遅刻し、さすがの優しいマネージャーも今日は一言ありましたね...次は気をつけます(笑)
今日の業務内容は引き続きメモリリークとその傍ら小さなバグの修正もって感じかな
- トピック:
- 疑問:
- 問題:
- プログラム内にメモリリークがある可能性がある
- 学習した内容:
- コントローラー内の定数はメモリリークを引き起こす原因になる
- 今後やりたいこと:
- リソース:
class MyController < ApplicationController FOO = [] def index FOO << "haha" end end
ここのFOO
はグローバル変数のように存在し、そのせいでindex
ページから離れてもガベージコレクションが起こらず、FOO
はその分のメモリを取り続ける。よって、メモリリーク発生!!
実際にメモリリークを発生させてみた
class PagesController < ApplicationController FOO = [] def index 1000000.times do FOO << "hello" end @size = FOO.length end end
まあ、わかっての通り、絶対やらないと思うけど、index
ページを訪れるたびにFOO
に1000000の"hello"を追加し、巨大な配列を構築する。
コードが書けたので、実践!!
1回実行した後の結果(ページ内の数字はFOO
の長さ)
その後、5回ページをリフレッシュした結果
もう明らかに赤線で引っ張ったところが上昇していて、これがメモリの使用状況を表している。そして、原因はFOO
配列がどんどん膨張し、同時になにもその存在をどける処理がないためである。
***僕みたいに馬鹿なことをする人はいないと思うけど、代わりになにもメモリを取らないputs
をFOO
に"hello"を追加するところにおいたら、コンピューターがクラッシュして電源を切ることになった。文字をプリントすることは時に危険なのだ(笑)***
まとめ
まずは週末を楽しむぜ!!
ご精読ありがとうございました。では、また次回まで✌