Ruby on Rails開発のインターン (Day 8)

こんにちは、皆さん!

今日は急用があって、1時間遅刻し、さすがの優しいマネージャーも今日は一言ありましたね...次は気をつけます(笑)


今日の業務内容は引き続きメモリリークとその傍ら小さなバグの修正もって感じかな


  • トピック:
  1. Railsでは何がメモリリークを引き起こすか
  2. 実際にメモリリークを発生させてみた


  • 疑問:


  • 問題:
  1. プログラム内にメモリリークがある可能性がある


  • 学習した内容:
  1. コントローラー内の定数はメモリリークを引き起こす原因になる


  • 今後やりたいこと:


  • リソース:
  1. How I spent two weeks hunting a memory leak in Ruby


Railsでは何がメモリリークを引き起こすか

Railsでは、自動でガベージコレクションがされるためメモリリークが起きるのは結構まれな話。しかし、メモリリークを引き起こすケースがいくつかある。このウェブサイト (How I spent two weeks hunting a memory leak in Ruby) の書きのコードがその可能性を教えてくれた。

class MyController < ApplicationController
  FOO = []

  def index
    FOO << "haha"
  end
end

ここのFOOグローバル変数のように存在し、そのせいでindexページから離れてもガベージコレクションが起こらず、FOOはその分のメモリを取り続ける。よって、メモリリーク発生!!

実際にメモリリークを発生させてみた

というわけで、自分でも実際にやってみていろんなものの変化を見てみようと思った。それで下記のようにPagesコントローラー付きのRailsアプリケーションを作り、テストしてみた。

class PagesController < ApplicationController
    FOO = []
    def index
        1000000.times do 
            FOO << "hello"
        end
        @size = FOO.length
    end
end

まあ、わかっての通り、絶対やらないと思うけど、index ページを訪れるたびにFOOに1000000の"hello"を追加し、巨大な配列を構築する。


コードが書けたので、実践!!
1回実行した後の結果(ページ内の数字はFOOの長さ)
f:id:Coding_Studio:20180714105338p:plain


その後、5回ページをリフレッシュした結果
f:id:Coding_Studio:20180714105535p:plain
もう明らかに赤線で引っ張ったところが上昇していて、これがメモリの使用状況を表している。そして、原因はFOO配列がどんどん膨張し、同時になにもその存在をどける処理がないためである。


***僕みたいに馬鹿なことをする人はいないと思うけど、代わりになにもメモリを取らないputsFOOに"hello"を追加するところにおいたら、コンピューターがクラッシュして電源を切ることになった。文字をプリントすることは時に危険なのだ(笑)***

まとめ

今日はRailsにおいてのメモリリークとはどんな感じなのか見れたので良い経験になった。問題は依然として解決してないけど、後でまた解決に乗り出せば大丈夫。
まずは週末を楽しむぜ!!


ご精読ありがとうございました。では、また次回まで✌



Day 9はこちら↓↓
programming-shop.hatenablog.com


Day 7はこちら↓↓
programming-shop.hatenablog.com