19 июля 2011 г.

Creating memory leaks in java

Любопытное обсуждение на StackOverflow -- какими способами можно создать утечки памяти в джаве. Тут есть некоторая тонкость в том, что именно называть утечками -- большинство описанных техник не приводят к утечкам памяти в том смысле, что объект, занимающий память, остается как-то доступным, просто сильно неочевидным образом. Я бы сказал, что это список (впечатляющий!) всевозможных косяков/багов/bad design в джаве, которые могут привести к застреванию неиспользуемых объектов в куче.

Список, на самом деле, очень впечатляющий -- стыдно сказать, но я даже не предполагал о большинстве из них, тех, что связаны с Thread/ThreadGroup и ClassLoader.

Мне еще понравился вариант с unsafe.allocateMemory(1024*1024);

4 комментария:

  1. А есть правильный ответ на этот вопрос? :) А то все рассуждения там похожи на холивары :)

    ОтветитьУдалить
  2. По-правде говоря, я не знаю. Тут все зависит от терминологии -- что называть утечками памяти. Лично мне кажется, что это правда какая-то холиварная тема, если к ней относиться слишком серьезно (собственно, любая тема становится холиварной, если к ней слишком серьезно относиться). Какая разница -- называть какой-то конкретный косяк с управлением ресурсами "утечкой памяти" или "багом/фичей реализации ClassLoader-а"? "Что значит имя? Роза пахнет розой..." -- и так, и эдак это косяк, и возможный источник нестабильности в работе программы, и так и эдак его надо как-то исправлять/обходить.

    ОтветитьУдалить
  3. Ок, можно более "генерально" спросить: как нужно написать код, чтобы программа вылетела со, скажем, StackOverflowException? Думаю, на так легче будет ответить :)

    ОтветитьУдалить
  4. Ну да, такой вопрос более прямой. Но тогда и ответ будет гораздо проще - неинтересно :)

    ОтветитьУдалить