Я разрабатываю инструмент, который берет код Java и генерирует код для получения оценок времени выполнения основных блоков, циклов и методов. После того, как какой-то блок выполнен, мы добавляем время нашему инструменту. Модель программы сохраняется в следующем представлении
static Hashtable<String, Hashtable<Integer, Hashtable<String, pair>>> method2Data = new Hashtable<String, Hashtable<Integer, Hashtable<String, pair>>>();
static Hashtable<String, Vector<String>> class2Method = new Hashtable<String, Vector<String>>();
и время, указанное методом
public static void addBlock(int id, double time, String meth, String thread);
Но у меня следующая проблема. При каждом вызове addBlock мы берем что-то из method2data . Так как у нас мог бы быть код как
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k < n; k++) {
addBlock(0,...);
addBlock(m,...);
}
мы вызываем addBlock много времени.
К сожалению, после некоторого постоянного времени работы над нашим кластером, программа просто перестает работать. Это все еще выглядит как процесс, но не требует никакого процессора. Я обнаружил, что если я удаляю код, который берет что-то из method2data , то все в порядке. Итак, я думаю, что есть некоторые проблемы с доступом к Hashtable. У кого-нибудь есть хорошие идеи?
Спасибо всем, похоже, что у меня тупик в случае одновременного доступа и, возможно, может не хватить памяти, когда нет параллельных вещей.