本当は怖いObjectSpace.each_object

5,918 views

Published on

0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,918
On SlideShare
0
From Embeds
0
Number of Embeds
301
Actions
Shares
0
Downloads
7
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

本当は怖いObjectSpace.each_object

  1. 1. 本当は怖い ObjectSpace.each_object nari(中村) ネットワーク応用通信研究所 Powered by Rabbit 0.5.7
  2. 2. 自己 紹介
  3. 3. 自己紹介 nariと申します 九州Ruby01会議でGCについて喋ったもの です はてなで「I am Cruby」というブログ 福岡出身の島根県民 島根は鳥取の左です! (大事な事なので二回言いました) 2/67
  4. 4. ObjectSpace.each_object
  5. 5. 超基本的 な疑問
  6. 6. ObjectSpace.each_object って何?
  7. 7. Heap内にある 全てのオブジェクト(一部除く)に対して
  8. 8. ObjectSpace.each_object {|o| puts o }
  9. 9. ObjectSpace.each_object {|o| puts o }
  10. 10. 引数に渡した ブロックの処理を行う
  11. 11. 例えば こんな処理が書ける
  12. 12. Heap内のオブジェクトを全 てpする
  13. 13. 特定のクラスのみをダンプ する.
  14. 14. Heap内のクラス数の統計を 取る
  15. 15. こ,これは便利!
  16. 16. 仕組み
  17. 17. 単純にHeap内を一つ一つな めていく 16/67
  18. 18. オブジェクトがあれば処理を 評価 17/67
  19. 19. 次へ 18/67
  20. 20. なるほど...
  21. 21. と言う事は...
  22. 22. こ,こんなコードも動く?
  23. 23. デモ
  24. 24. Ruby内部では
  25. 25. 処理を評価&やる夫生成 24/67
  26. 26. 次へ,処理を評価&やる夫 生成 25/67
  27. 27. 次へ,やる夫登場&やる夫 生成 26/67
  28. 28. 次へ,やる夫登場&やる夫 生成 27/67
  29. 29. 次へ,やる夫登場&やる夫 生成 28/67
  30. 30. 結果
  31. 31. やる夫が増殖! 30/67
  32. 32. こっ,これは完全に Ruby暗黒面ですね!
  33. 33. ここで疑問
  34. 34. 『これって,処理中に オブジェクトを生成しても何 でフリーズしないの?』
  35. 35. つまりさっきの様に
  36. 36. 処理時にオブジェクト生成 35/67
  37. 37. 処理時にオブジェクト生成 36/67
  38. 38. 処理時にオブジェクト生成 37/67
  39. 39. 処理時にオブジェクト生成 38/67
  40. 40. 処理時にオブジェクト生成 39/67
  41. 41. 無限ループへ... 40/67
  42. 42. って事になぜならないの か?
  43. 43. 理由
  44. 44. GC 可愛いよGC!
  45. 45. オブジェクトがあれば処理を 評価 44/67
  46. 46. その処理内でオブジェクト生 成 45/67
  47. 47. そのオブジェクトで処理を評 価 46/67
  48. 48. その処理内でオブジェクト生 成 47/67
  49. 49. ヒープがいっぱいになったら GC発動! 48/67
  50. 50. ゴミが回収されて無限ループ 回避 49/67
  51. 51. GCによって無限ループを 回避していた.
  52. 52. なのでGC.disable=trueにす ると
  53. 53. デモ
  54. 54. 返ってこない!
  55. 55. GCが動かないので無限に オブジェクトが生成されてし まった
  56. 56. ちなみにさっきのHeap内の 統計を取ったものは
  57. 57. 正確な値じゃない
  58. 58. デモ
  59. 59. このような場合,Ruby1.9で は ObjectSpace.count_objects があります.
  60. 60. 最後に
  61. 61. 実際にある 悪用例
  62. 62. デンマーク出身のDHHさん の場合 61/67
  63. 63. あるクラスのサブクラスを取 得する class Object def subclasses_of(*superclasses) subclasses = [] superclasses.each do |sup| ObjectSpace.each_object(class << sup; self; end) do |k| if k != sup && (k.name.blank? || eval(quot;defined?(::#{k}) && ::#{k}.object_id == k.object_idquot;)) subclasses << k end end end subclasses end end 62/67
  64. 64. 使うときは class Fizz; end class Buzz < Fizz; end class FizzBuzz < Fizz; end subclasses_of(Fizz) #=> [Buzz, FizzBuzz] 63/67
  65. 65. これだけの為にヒープ全て をブン回す!!!
  66. 66. ActiveSupport に入ってます.
  67. 67. まとめ ObjectSpace.each_objectは完全な暗黒面で す. 大事な場面では使わないようにしましょう. どうでもいいような所で使いましょう. 例えばデバッグとかデバッグとか 66/67
  68. 68. ご静聴 ありがとうございました.

×