Нуждаюсь в помощи устраняя слабые ссылки в моем приложении

Не видел никого для Java (который не известен его минимальным синтаксисом btw), поэтому сначала, я сделал это

String g;
public void sing() {
    g = "";     
    for(Entry<?,?> e : mm("first", "a partridge in a pear tree",
                          "second", "two turtle doves, and ",
                          "third", "three french hens, ",
                          "fourth", "four calling birds, ",
                          "fifth", "five gold rings, ",
                          "sixth", "six geese a-laying ",
                          "seventh", "seven swans a-swimming, ",
                          "eigth", "eight maids a-milking, ",
                          "ninth", "nine ladies dancing, ",
                          "tenth", "ten lords a-leaping, ",
                          "eleventh", "eleven pipers piping, ",
                          "twelfth", "twelve drummers drumming, ").entrySet()) {
        System.out.println("On the "+e.getKey()+
                " day of Christmas my true love gave to me "+e.getValue()+".");
    }
}

public Map<?,?> mm(String... s) {
    Map m = new LinkedHashMap();
    for(int i=0;i<s.length;i=i+2) {
        g = s[i+1] + g;
        m.put(s[i], g);
    }
    return m;
}

и понял, что это довольно сложно (взвешивает 708 символов), таким образом, я пошел для большего простого решения (адаптированный из других ответов, строка изменяется только для удобочитаемости):

public void sing() {
    String s = "";
    String[]d={"first","second","third","fourth",
           "fifth","sixth","seventh","eighth",
           "ninth","tenth","eleventh","twelfth"};
    String[]g={"a partridge in a pear tree",
           "two turtle doves, and ",
           "three french hens, ",
           "four calling birds, ",
           "five gold rings, ",
           "six geese a-laying ",
           "seven swans a-swimming, ",
           "eight maids a-milking, ",
           "nine ladies dancing, ",
           "ten lords a-leaping, ",
           "eleven pipers piping, ",
           "twelve drummers drumming, "};
    int i=0;
    while(i<12)
        System.out.println("On the "+d[i]+" day of Christmas my true love gave to me "+
            (s=g[i++]+s)+".");
}

, который является 576 символами без пробелов, если сигнатура метода переключается на надлежащее основное () тогда, это 596.

, Если бы у меня был интерес сделать третью версию, я попробовал бы перечислимый прием также.

6
задан Mark 10 July 2009 в 14:30
поделиться

4 ответа

Я обнаружил, что мои слабые ссылки были созданный классом System.Diagnostics.TextWriterTraceListener. У меня до сих пор не устранена утечка памяти, и я так глубоко в ней разбираюсь, что начинаю сомневаться, есть ли у меня утечка памяти или нет, но я с облегчением узнал, откуда берутся WeakReferences.

Спасибо всем, кто разместил!

1
ответ дан 17 December 2019 в 00:13
поделиться

В битвах с утечками ресурсов .NET (память / дескрипторы / потоки / и т. Д.) Мы обнаружили одну причину, которая выше всего остального: затяжные обработчики событий. Если у меня есть объект, от которого я хотел бы избавиться, но у меня все еще есть обработчик событий, зарегистрированный для события этого объекта, то объект на самом деле не исчезнет - эти зомби размножаются и объединяются в цепочки до бум! ваше управляемое приложение имеет то, что является для всех намерений и целей утечкой ресурсов.

Мы использовали метод дробовика и прочесали наши наиболее часто используемые и самые тяжелые классы на предмет событий, которые мы добавляем вручную и с помощью ключевого слова "Handles" VB.NET и убедитесь, что RemoveHandler / - = вызывается для каждого из них во время Dispose. Мы также явно утилизируем как можно больше.

ANTS - отличный инструмент для их отслеживания, но это не простой инструмент (но это самый простой из инструментов, которые я нашел для решения этих проблем). Потратьте некоторое время на ознакомление с ним, а если вы работаете с версией 5, воспользуйтесь этими новыми фильтрами.

К сожалению, серебряной пули нет, это одна из моих самых больших проблем с .NET, потому что обычно вы не знаете себя иметь проблему до тех пор, пока она не станет ужасно широко распространенной, и с ней будет трудно справиться.

3
ответ дан 17 December 2019 в 00:13
поделиться

Использование WeakReference не должно вызывать утечки памяти. Это приведет к сбору объекта, но у вас все еще есть возможность получить к нему доступ в последнюю минуту.

Я не работал с профилировщиком памяти, но:

Все мои утечки памяти в приложении .Net связаны с событиями / делегаты.

Когда вы добавляете метод для прослушивания события, вы создаете ссылку из объекта, содержащего событие (ключевое слово), на объект, у которого есть метод, который вы хотите вызвать.

Если все другие ссылки на объект который содержит метод, ушел, вы можете подумать, что он будет собран, но все еще есть (невидимая) ссылка через событие.

2
ответ дан 17 December 2019 в 00:13
поделиться

Эта утечка памяти - известная ошибка в платформах .NET. __ENCList - это внутренний класс .NET, который используется для обеспечения функциональных возможностей редактирования и продолжения. Единственное решение этой проблемы - перекомпилировать в режиме выпуска. (Что жаль, если вы использовали режим отладки для предоставления подробных отчетов об исключениях в производственных средах.)

http://support.microsoft.com/?kbid=919481

Moataz Компьютерный инженер

1
ответ дан 17 December 2019 в 00:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: