Точка останова на построении массива

Есть ли способ установить точку останова в 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() который напечатает все элементы в массиве

Другие вопросы по тегам