LINUX.ORG.RU

deadlock в жабе

 , ,


0

2

Есть классы A и B:

class A
{
    private B b;
    ...

    b = new B(this);
}

class B
{
    private A a;
    public B(A a)
    {
         this.a = a;
    }
}

Сможет ли GC корректно уничтожить класс A в данном случае.

★★

Последнее исправление: maverik (всего исправлений: 2)

У тебя каша в голове. GC не уничтожает классы. А то, что ты имеешь в виду, да, сможет.

anonymous
()
Ответ на: комментарий от anonymous

Ну вот у меня есть эксземпляр класса A. GC должен освободить его (финализировать или как там это в жабе правильно назвать), когда он уже никем не используется (нет ссылок на него). Вопрос был: сможет ли GC или нет это сделать.

maverik ★★
() автор топика
Ответ на: комментарий от anonymous

А как найти виновника того, что heap течет и я получаю OOME: java heap? Я запустил прогу под JVisualVM, вижу что heap кто-то жрет, но не знаю, как определить, кто именно. Кто-то видимо держит ссылки на объекты, которые уже не нужны. Проблема в том, что прога дюже большая, сотни тредов, тыщщи классов.

maverik ★★
() автор топика
Ответ на: комментарий от anonymous

Ну не гигантский, но 3Мб исходников и добрая сотня сторонних либ. Если я начну весь код разгребать (и низкоуровневый, и работа с БД и UI), то застряну на месяц. Вот думаю, мб есть тулза для поиска мертвых ссылок (или как еще назвать их). Сейчас пытаю JVisualVM.

maverik ★★
() автор топика
Ответ на: комментарий от maverik

Кто-то видимо держит ссылки на объекты

Например

new Thread() {
    public void run() { ... }
};

это утечка.

crowbar
()
Ответ на: комментарий от maverik

Надо сделать java core dump - это сохранит всю память процесса в файл. Потом этот dump анализируется специальной программой, например Eclipse MAT. Он показывает все объекты и все связи между ними. Находишь, какие объекты занимают аномально много памяти и кто их держит.

Legioner ★★★★★
()
Ответ на: комментарий от maverik

передать -XX:+HeapDumpOnOutOfMemoryError аргументом в java и дождаться OutOfMemoryError. Куда то он его сгенерирует. В линуксе вроде можно сигнал какой-то послать. Лучше погуглить в общем, тема известная.

Legioner ★★★★★
()

Да, без проблем.

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.