この質問によると、Javaでオブジェクトのメモリサイズを決定する標準的な方法は、java.lang.instrumentationを使用することです。いくつかの調査の結果、これを実現するためのScala固有の方法はないように思われるため、ここでもJavaアプローチを適用する必要があります。
残念ながら、Javaのバックグラウンドを持たないScalaプログラマーにとって、この手法をScalaに適応させることは完全に簡単ではありません。私の質問は次のとおりです。
質問1
ここで何が起こっているのですか?別のJARにクラスを配置する必要がある理由は、ObjectSizeFetcher
それを使用する実際のプログラムの前に、何らかの方法でクラスがロードされるようにするためだと思います。Premain-Class
エントリとパラメータがないとインストルメンテーションを使用できないと思います-javaagent:TheJarContainingObjectFetcher.jar
か?
質問2
SBTで完全なワークフローを実装する簡単な方法はありますか?現在、やや面倒な解決策しかありません。最初に、セカンダリSBTプロジェクトをセットアップして、それを定義ObjectSizeFetcher
してJARにパッケージ化する必要があります。Premain-Class
これまでのところ、パッケージ化中にエントリをJARに自動的に追加する方法がわからなかったため、手動で解決する必要がありました。結果のJARを、使用したいプロジェクトのローカルライブラリに追加できますgetObjectSize
。このプロジェクトでは、を有効にfork in run
して使用する必要がありますjavaOptions in run += "-javaagent:TheJarContainingObjectFetcher.jar"
。既存のSBTプロジェクト内でインストルメンテーションをすばやく使用するためのより単純な(そして邪魔にならない)ワークフローはありますか?Premain-Class
たぶん、このセカンダリJARを不要にすることについてSBTに直接伝えることができますか?
質問3
Scalaでオブジェクトのメモリ使用量を評価するためのまったく異なる方法をお勧めしますか?