确定对象的大小:在scala/sbt中使用检测的最佳方法

blu*_*e10 9 java memory instrumentation scala sbt

根据这个问题,确定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项目中的仪器?也许我可以直接告诉SBT有关Premain-Class使这个辅助JAR不必要吗?

问题3

您是否会建议使用完全不同的方法来评估Scala中对象的内存使用情况?

v6a*_*6ak 2

回答1:是的,如果你想要仪器,你需要获取一个实例。如果没有 Premain-Class 和 -javaagent,您可能无法获得它。

答案 2:您可以(并且可能需要)使用类加载器并创建一个非常简单的引导项目(在 Java 中或在带有 Proguard 的 Scala 中)。原因有二:

第一个原因:方便。您可以使用 java.net.URLClassLoader 来包含标准 Scala 库和项目的类目录。测试时不再需要将其重新打包到 JAR 中。

第二个原因:防止JAR地狱。您可能知道 Scala 不兼容二进制。您还应该知道 Java 代理与应用程序一起加载在同一个类加载器中。如果类加载器包含 Scala 库,应用程序就不能简单地使用另一个 Scala 版本。

但是,如果 Java 代理不直接使用 Scala 库(例如,它是引导应用程序并在另一个类加载器中加载真实代理及其库),则受检测的应用程序可以自由使用任何 Scala 库。

答案 3:我可能也会使用仪器。