Точка останова на построении массива
Есть ли способ установить точку останова в eclipse или другом отладчике, чтобы выполнение останавливалось при построении массива? Я особенно заинтересован в построении примитивного массива (int[]), но этот вопрос должен быть одинаково применим к любому массиву.
Мне нужно найти виновника (ов), создающих большое количество мусора, состоящего из int[], char[] и byte[] среди других, поэтому, если я смогу поставить точку останова с некоторыми условиями, я смогу сузить код,
Я попытался использовать профилирование памяти yourkit, но он показывает только распределение только для крошечной части этих объектов, а остальные отображаются как <objects without allocation information>
Я не уверен почему. Когда я иду в Objects unreachable from GC roots
просмотр, я вижу информацию о распределении только около 7% мусора. С распределением для такого небольшого процента объектов, я даже не уверен, что мне не хватает некоторых мест. Есть ли способ получить YK, чтобы сохранить все распределения?
3 ответа
Когда вы создаете массив, виртуальная машина просто резервирует столько памяти для заполнения ссылками. Это одностадийная собственная операция, и точка останова в процессе выделения памяти будет невозможна. Например, возьмите следующий код
public class Test{
public void createArray(){
int[] iarray = new int[10];
}
}
Теперь, если вы разберете это, вы получите следующий набор инструкций
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public void createArray();
Code:
0: bipush 10
2: newarray int
4: astore_1
5: return
}
Обратите внимание на определение метода createArray()
, newarray int
это отдельная инструкция для выделения памяти заданному количеству элементов.
Я работаю на YourKit, поэтому постараюсь уточнить сообщение "объекты без информации о размещении".
По умолчанию профилировщик YourKit записывает распределение каждого 10-го объекта. Это настраиваемый параметр, поэтому изменение значения "Записать каждый" на 1 должно помочь. Вот подробности из документации профилировщика http://www.yourkit.com/docs/11/help/allocations.jsp
World of Primitive arrays is really mysterious and I don't think anyone is allowed in there ;).
Единственный способ просмотреть код Java в отладке - F5
но F5 i.e.Step in
Работает только для функций без объявления, так что я думаю, что это невозможно.
Чтобы убедиться, что вы можете распечатать эти массивы с помощью Arrays.toString()
который напечатает все элементы в массиве