2016-03-19 5 views
7

Я работаю над программой, которая постоянно занимается гигабайтами данных, в основном примитивов и строк. Мне нужно избегать примитивов, преобразованных в объекты посредством autoboxing, поскольку это взрывает размер кучи и время GC.Как я могу обнаружить/избежать автобоксинга в Java?

В настоящее время я вношу изменения и запускаю код в VisualVM и вижу, что у меня есть миллионы дополнительных целых чисел или шорт или объектов. Затем я просматриваю код в отладчике в своих библиотеках и классах JDK, чтобы найти, где происходит бокс. Есть ли инструменты для этого?

Я использую Intellij как свою IDE. В Intellij вы можете использовать проверку, чтобы найти авто-бокс в своем собственном коде, но он, похоже, не распространяется на библиотечный код. Для этого выберите в меню:

Analyzye >> Выполнить осмотр по имени ...

Затем введите в «Auto» в командной строке. Для выбора должен быть установлен автоматический бокс.

Однако на данный момент Я удалил практически все авто-бокс из собственного кода. Мне нужно, чтобы узнать, когда я передаю примитив в библиотечный метод, - это код библиотеки, автоматически устанавливающий примитив в любой момент.

+0

Когда речь идет о количествах данных, когда автооблок становится проблемой, Java может быть не подходящим языком для вашего приложения. Рассмотрим использование c или C++. В качестве альтернативы вы можете написать программу на c, которая обрабатывает ваши данные, а затем отображает результаты в вашем приложении Java. –

+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

Вы должны посмотреть через свой код любые ссылки на Integer, Double и т. Д. Должно быть легко сделано с помощью Eclipse или IntelliJ. Возможно, вы держите много данных в сборке Javas в Картах, Коллекциях и т. Д., С примитивными типами оберток, которые являются автобоксами из-за дженериков?

Хороший способ избавиться от этого - использовать GNU Trove вместо javas, встроенных в структуры данных: http://trove4j.sourceforge.net/html/overview.html. В разделе «Карты и коллекции» используются примитивные типы, а не дженерики, и сокращается использование памяти.

Другим виновником создания множества экземпляров объектов может быть использование интерфейса 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

Должна быть возможность написать простой javaagent, которая добавляет ведение журнала для valueOf вызовов (Integer.valueOf) Все, что нужно для выполнения этой задачи является байт-код манипуляции библиотеки, такие как Javassist

+0

Это то, как все бокс выполняется? Я предположил, что если вы передадите int i методу foo (Integer i), бокс обрабатывался непосредственно компилятором –

+0

Afaik, это всегда делается с использованием valueOf. Я посмотрю, если я смогу найти доказательства с помощью этого крошечного мобильного экрана :-) –

+0

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

0

Если у вас есть источник библиотек вы используете, как насчет использования Структурный поиск & Заменить? Используйте кнопку Copy existing template... в диалоговом окне «Структурный поиск» & «Заменить» и выберите boxed expressions. Это найдет все места, где выражаются (не явно) выражения.

Поиск по области Project and Libraries для поиска по всему миру или для создания пользовательской области с, например, шаблоном, например lib:omg.a.package..*, для поиска только в этом пакете.