Rubyアプリケーションで何が起こっているのですか?
Rubyアプリケーションで何が起こっているのか疑問に思っているなら…
派手なGUIツールはありません …
しかし、ObjectSpaceモジュールがあります!
ObjectSpace アプリケーションの現在の状態に関する情報を提供します。
それがどのように機能するかを発見しましょう。
オブジェクトのカウント
ObjectSpace
の使用 プログラムで現在「生きている」オブジェクトを知ることができます。
オブジェクトが生きているとはどういう意味ですか?
オブジェクトは、それを指す参照がある限り存続します。参照は、変数や定数などのオブジェクトにアクセスするための単なる方法です。
オブジェクトに到達できない場合は、メモリから安全に削除できることを意味します。
例 :
# The variable 'name' holds a reference to the string 'Dave'. name = 'Dave' # The 'name' variable now points to 'John'. # 'Dave' no longer has a reference pointing to it. name = 'John'
次に、ObjectSpace
の例を見てみましょう。 動作中:
require 'objspace' # This is valid Ruby syntax, but doesn't work on irb/pry ObjectSpace .each_object .inject(Hash.new 0) { |h,o| h[o.class] += 1; h } .sort_by { |k,v| -v } .take(10) .each { |klass, count| puts "#{count.to_s.ljust(10)} #{klass}" } # Copy & paste version (use this for irb/pry) ObjectSpace.each_object.inject(Hash.new 0) { |h,o| h[o.class] += 1; h }.sort_by { |k,v| -v }.take(10).each { |klass, count| puts "#{count.to_s.ljust(10)} #{klass}" }
これにより、上位10クラスのオブジェクト数を含むテーブルが出力されます。
Count Class ------------------------- 5436 String 315 Class 251 Array 101 Encoding 69 Regexp 45 Hash 26 Module 25 Gem::Version 22 Gem::StubSpecification::StubLine 22 Gem::StubSpecification
メモリリークが疑われる場合は、このデータを1時間ごとにログに記録し、常に増加し続けるが減少しないオブジェクト数があるかどうかを確認できます。
オブジェクトを楽しむ
ObjectSpace
を使用する場合 オブジェクトに関する情報だけでなく、実際のオブジェクトにアクセスできるため、すべての文字列の値を印刷したり、すべてのFile
のパスを印刷したりするなど、楽しいことができます。 オブジェクト。
例 :
ObjectSpace .each_object(String) .sort_by { |s| s.size } .each { |s| p s }
これにより、サイズでソートされたすべてのメモリ内文字列が出力されます。自分で作成したのではなく、Rubyインタープリターによって作成された文字列がたくさんあることに気付くでしょう。
実用的な用途は?
さて、これは主にあなたのアプリに関する統計をデバッグして収集するためのものです🙂
オブジェクトのメモリサイズ
もう1つできることは、ObjectSpace.memsize_of
を使用することです。 特定のオブジェクトのメモリサイズを見つけるため。
例 :
o = "a" * 100 ObjectSpace.memsize_of(o)
覚えておくべきことの1つは、ドキュメントからのこの警告です:
「返品サイズが不完全であることに注意してください。この情報はヒントとしてのみ扱う必要があります。」
さまざまな種類のオブジェクトでこのメソッドを試してみると、興味深いことがいくつか見つかります 、Fixnum
のように sは常に0を返します。
ObjectSpace.memsize_of(42) # 0
これは、Rubyが内部でFixnum
を作成しないためです。 オブジェクトについては、Rubyの数値について書いた投稿で詳しく知ることができます。
もう1つの興味深いものは文字列です:
ObjectSpace.memsize_of("A" * 22) # 40 ObjectSpace.memsize_of("A" * 23) # 40 ObjectSpace.memsize_of("A" * 24) # 65
"A" * size
を使用しています 入力せずに長い文字列を作成する方法として🙂
待って!何が起こったのですか?
そうですね、Rubyには24文字未満の文字列に対する最適化が組み込まれていることがわかりました。そのため、その後メモリ使用量が急増します。これについては、PatShaughnessyのこの投稿で詳しく見ることができます。
エイリアスメソッドを見つける方法
Rubyのすべてのエイリアスメソッドの「マスター」リストがあればいいと思いませんか?
よろしくお願いします!
これを見てください :
class Module def aliased_methods instance_methods(false) .group_by { |m| instance_method(m) } .map(&:last) .keep_if { |symbols| symbols.length > 1 } end end
Stackoverflowの回答からこのコードを取得しました。 aliased_methods
を定義します Module
のメソッド instance_methods
を使用するクラス クラスで定義されているすべてのインスタンスメソッドのリストを取得するメソッド。
少し紛らわしいように聞こえるかもしれませんが、それはあなたにとってメタプログラミングです!
これが残りのコードで、少なくとも1つの「生きている」オブジェクトを持つすべてのクラス名の配列を構築し、aliased_methods
を呼び出します。 すべてのクラスで&出力を出力します。
objects = ObjectSpace.each_object.map(&:class).uniq objects.each do |klass| methods = "n#{klass}n#{'-'*20}n" klass.send(:aliased_methods).each do |m1, m2| methods << "#{m1.to_s.ljust(15)} #{m2}n" end puts methods end
出力は次のようになります :
Array -------------------- inspect to_s [] slice length size find_index index collect map collect! map!
結論
ObjectSpace
でできるすばらしいことを楽しんでいただけたでしょうか。 、今すぐ試してみて、何か面白いものがあれば教えてください!
この投稿をプログラマーの友達全員と共有することを忘れないでください。彼らが何か新しいことを学ぶのに役立ち、より多くの読者を獲得するのに役立ちます🙂
-
Ruby on Railsとは何ですか?なぜそれが役立つのですか?
Ruby on Rails(RoRの場合もある)は、最も人気のあるオープンソースのWebアプリケーションフレームワークです。 Rubyプログラミング言語で構築されています。 Railsを使用すると、単純なものから複雑なものまで、アプリケーションの構築に役立ちます。Railsで実行できることには制限がありません。 フレームワークとは何ですか? フレームワークは、ソフトウェアを作成するときに使用する特定の構造を提供するコード、ツール、およびユーティリティのコレクションです。 この構造により、コードがより整理されます。 正しく使うことを学ぶと、作業が簡単になります。 レールは正確に何を
-
Windows ログオン アプリケーションとは?
Windows オペレーティング システムでは、コンピューターでの作業中に多くのプロセスが実行されています。 Runtime Broker、システム割り込み、DWM などのプロセスに精通している必要があります。これらのすべてのプロセスには独自の重要性があり、Windows コンピューターの通常の操作に関与しています。 知っておくべき最も重要なプロセスの 1 つは、Windows ログオン アプリケーションまたは winlogon.exe です。 Windows ログオン アプリケーションとは何か、そしてその重要性について疑問に思っているはずです。そのすべてを知っておきましょう! Windo