如何在Java中检测/避免自动装箱?

L. *_*anc 8 java autoboxing intellij-idea primitive-types

我正在研究一个不断处理千兆字节数据的程序,主要是基元和字符串.我需要避免通过自动装箱将原语转换为对象,因为这会爆炸堆大小和GC时间.

目前,我在VisualVM中进行更改并运行代码,看看我有数百万个额外的整数或短片或对象.然后我将调试器中的代码单步执行到我的库和JDK类中,以找到装箱发生的位置.有工具来帮助解决这个问题吗?

我使用Intellij作为我的IDE.在Intellij中,您可以使用检查在您自己的代码中查找自动装箱,但它似乎不会扩展到库代码.为此,请从菜单中选择:

Analyzye >>按名称运行检查...

然后在提示符下键入"auto".应出现自动装箱检查以供选择.

但是,在这一点上,我已经从我自己的代码中删除了基本上所有的自动装箱.我需要的是能够找出当我将原语传递给库方法时,库代码是否在任何时刻自动装箱基元.

Sas*_*ian 1

您应该在代码中查找对 Integer、Double 等的任何引用...应该可以使用 Eclipse 或 IntelliJ 轻松完成。您是否可能在地图、集合等中构建的 Java 中保存大量数据,并使用由于泛型而自动装箱的原始类型包装器?

摆脱这个问题的一个好方法是使用 GNU Trove 而不是内置数据结构的 java:http://trove4j.sourceforge.net/html/overview.html。In 提供使用原始类型而不是泛型的映射和集合,并减少内存使用。

创建大量对象实例的另一个罪魁祸首可能是使用 InvocableHandler 接口。每次调用方法时,这个东西都会为方法的参数创建一个对象数组。代理对象经常利用这一点。您是否有第三方库或自己的代码可以执行此操作?

最后,使用可以分层显示对象实例的探查器。我认为 VisualVM 就是这样做的,但不确定。

您不必像某些人建议的那样求助于 C++。您可以围绕它进行设计。