Я бы просто использовал одну переменную для управления приращением цикла for:
for (i=0; menu_statetop[i].state; i++)
В ответ на Weather Vane вы можете обработать смещение индекса массива в теле цикла for. Это намного яснее и надежнее.
Я также был бы осторожен с переменной, которую вы используете в качестве условия для цикла for. в вашем коде вы используете переменную menu_statetop [i] .state, которая выглядит как целое число / enum. Если бы не было "перерыва"; в цикле цикл for будет выполняться до тех пор, пока значение, содержащееся в menu_statetop [i] .state, не равно 0.
Я бы посмотрел на анализатор памяти затмения . Этот инструмент великолепен, и я посмотрел несколько куч Gig с этим инструментом. Хорошая вещь об инструменте - это то, что он создает индексы в дампе, поэтому он не все в памяти сразу.
Какие флаги вы передаете Jhat? Убедитесь, что вы находитесь в 64-битном режиме, и вы устанавливаете размер кучи достаточно большим.
Мне пришлось загрузить файл hprof объемом 11 ГБ, и я не смог с анализатором памяти Eclipse. В итоге я написал программу, уменьшающую размер файла hprof путем случайного удаления информации об экземпляре. Как только размер файла hprof уменьшился до 1 ГБ, я мог открыть его с помощью анализатора памяти Eclipse и получить представление о том, что вызывало утечку памяти.