2016-03-19 18 views
7

私は、ギガバイトのデータ、主にプリミティブと文字列を扱うプログラムに取り組んでいます。オートボクシングによってプリミティブがオブジェクトに変換されるのを避ける必要があります。これは、ヒープサイズとGC時間を爆発させるためです。Javaでオートボクシングを検出/回避するにはどうすればよいですか?

現在、私はVisualVMでコードを変更して実行しており、何百万もの余分な整数やショート、オブジェクトを持っているのを見ています。次に、デバッガのコードをライブラリとJDKクラスに移動して、ボクシングの発生場所を確認します。これに役立つツールがありますか?

私はIDEとしてIntellijを使用しています。 Intellijでは、検査を使用して独自のコードでオートボックスを見つけることができますが、ライブラリコードには拡張されていないようです。これを行うには、メニューから選択します。

Analyzye >>実行検査を名前で...

はその後プロンプトで「自動」を入力します。自動ボクシング検査が選択のために現れるはずです。

ただし、この時点で私は自分のコードから本質的にすべての自動ボックスを削除しました。私が必要とするのは、プリミティブをライブラリメソッドに渡すときに見つけることができることです。ライブラリコードは、いつでもプリミティブを自動的にボクシングします。

+0

自動ボクシングが問題になるデータ量を処理する場合、Javaはアプリケーションに適した言語ではない可能性があります。 cまたはC++の使用を検討してください。あるいは、データを処理してJavaアプリケーションの中に結果を表示するプログラムをC言語で記述することもできます。 –

+0

[findbugs](https://plugins.jetbrains.com/plugin/3847)を試してみましたか? –

+0

この関連する質問には、いくつかの有益な提案が含まれています。 http://stackoverflow.com/questions/15818875/how-to-disable-auto-boxing-for-java-in-intillij-idea –

答えて

1

あなたは整数、ダブルなどへの参照のためにあなたのコードを谷になります...簡単にEclipseやIntelliJので行うべきです。ジェネリックのために自動ボクシングされるプリミティブ型のラッパーを使って、Map、CollectionsなどのJavasビルドで多くのデータを保持していますか?

これを取り除く良い方法は、javasの代わりにGNU Trove()を使用することです。 Inでは、ジェネリックではなくプリミティブ型を使用し、メモリ使用量を削減するマップとコレクションを提供しています。

多くのオブジェクトインスタンスを作成するもう1つの原因は、InvocationHandlerインターフェイスの使用です。このことは、メソッドが呼び出されるたびにメソッドのパラメータ用のオブジェクトの配列を作成します。プロキシオブジェクトはこれを利用することがよくあります。おそらくサードパーティのライブラリや独自のコードを持っていますか?

最後に、オブジェクトインスタンスを階層的に表示できるプロファイラを使用します。私はVisualVMがこれをしていると確信しています。

C++に訴える必要はありません。あなたはその周りにデザインすることができます。

+0

ありがとうございます。私はfastutiライブラリhttp://fastutil.di.unimi.it/を使用します。これはTroveのようです。私はInvocationHandlerを調べなければならないでしょう。 –

+0

Troveよりも優れたオプションがあります:http://java-performance.info/hashmap-overview-jdk-fastutil-goldman-sachs-hppc-koloboke-trove-january-2015/ – leventov

1

のvalueOfのロギングを追加する簡単なjavaagentを書き込むことが可能である必要がありますが、この作業のために必要なすべては、あなたがライブラリのソースを持っていると仮定すると、このようなJavassistの

+0

これはどのようにボクシングが行われるのでしょうか?私はint foo(Integer i)にint iを渡すと、ボクシングはコンパイラ –

+0

Afaikによって直接処理されたと仮定しました。これは常にvalueOfを使って行われます。私はこの小さなモバイル画面でいくつかの証拠を見つけることができます:-) –

+0

http://stackoverflow.com/questions/408661/what-c​​ode-does-the-compiler-generate-for-autoboxing –

0

として、バイトコード操作ライブラリである(Integer.valueOf)を呼び出します使用しています、構造検索を使用する方法&置き換えますか?構造検索&置換ダイアログでCopy existing template...ボタンを使用し、boxed expressionsを選択します。これにより、式が(明示的に)ボックス化されていない場所がすべて検索されます。

Project and Librariesを検索して、どこでも検索するか、たとえばlib:omg.a.package..*のようなパターンでカスタムスコープを作成して、そのパッケージのみを検索します。

関連する問題