根据这个问题,在 Java 中确定对象内存大小的标准方法是使用 java.lang.instrumentation。经过一些研究,似乎没有 Scala 特定的方法来实现这一点,所以 Java 方法也应该适用于此。
不幸的是,对于没有 Java 背景的 Scala 程序员来说,在 Scala 中采用这种技术并不完全简单。我的问题是:
问题 1
这里到底发生了什么?我猜我们必须将类ObjectSizeFetcher
放在单独的 JAR 中的原因是为了确保它在我们想要使用它的实际程序之前以某种方式加载。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 项目中快速使用仪器?也许我可以直接告诉 SBTPremain-Class
以使这个辅助 JAR 变得不必要?
问题 3
你会推荐一种完全不同的方法来评估 Scala 中对象的内存使用情况吗?