Вопрос

Я программист на C ++, в настоящее время пытаюсь работать на Java.Работая на C ++, у меня есть привычка отслеживать динамическое распределение памяти и использовать различные методы, такие как RAII, чтобы избежать утечки памяти.Java, как мы знаем, предоставляет сборщик мусора (GC) для устранения утечек памяти.Итак, при программировании на Java следует ли просто отбросить все полезные заботы о куче памяти и предоставить GC самому позаботиться об утечках памяти, или следует использовать подход, аналогичный подходу при программировании языков без GC, постарайтесь позаботиться о выделяемой вами памяти и просто позвольте GC позаботиться о тех, которые вы можете пропустить.Каким должен быть подход?Каковы недостатки того и другого?

Это было полезно?

Решение

Я не уверен, что вы имеете в виду, пытаясь позаботиться о памяти, вы выделяете в присутствии GC, но я попробую некоторую умницу.

По сути, вы не должны «беспокоиться» о вашей памяти. Если вы больше не ссылаетесь на объекты, они будут подняты. Логические утечки памяти все еще возможны, если вы создаете ситуацию, когда объекты ссылаются на остальную часть вашей программы (пример: зарегистрируйте слушателей и никогда не регистрируйте их, пример: реализация векторной коллекции, которая не устанавливает элементы для null При удалении предметов с конца).

Однако, если у вас есть сильный фон Raii, вы будете дезапаливаться, чтобы узнать, что в Java нет прямого эквивалента. GC является первоклассном инструментом для решения памяти, но нет гарантированного, когда (или даже если) вызываются финализаторы. Это означает, что первоклассный лечение, примененное к памяти, нет Применяется на любой другой ресурс, такой как: Windows, соединения базы данных, сокеты, файлы, примитивы синхронизации и т. Д.

Другие советы

С Java и .NET (и я представляю, большинство других языков GC'Ed) вам не нужно много беспокоиться о памяти кучи вообще. Что ты делать Необходимо беспокоиться, это родные ресурсы, такие как файловые ручки, розетки, GUI примитивы, такие как шрифты и такие. Те, кто обычно должен быть «утилизирован», который выпускает родные ресурсы. (Они часто распоряжаются в доработке в любом случае, но это вроде, если я вернулся на это. Утилизируйте вещи сами.)

С GC вам нужно:

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

Кроме этого, вы не мочь Действительно «позаботиться о памяти, которую вы выделяете», и пытаясь сделать это, будет пустой тратой времени.

Технически вам не нужно беспокоиться о очистинии после ассигнований памяти, поскольку все объекты должным образом отсчетятся, и GC позаботится обо всем. На практике переустойчивый GC негативно воздействует на производительность. Так что в то время как Java не имеет delete Оператор, вы будете хорошо повторно повторно использовать объекты как можно больше.

Также Java не имеет деструкторов, поскольку объекты будут существовать, пока GC не доберется до них. Java поэтому имеет finally Конструкция, который вы должны использовать, чтобы гарантировать, что все ресурсы, связанные с памятью (файлами сокетов и т. Д.), когда вы закончите с ними. Не полагайтесь на finalise Способ сделать это для вас.

В Java GC заботится о выделении памяти и освобождении неиспользуемой памяти.Это не означает, что вы можете полностью игнорировать проблему.

Java GC освобождает объекты, на которые нет ссылок из корневого каталога.Это означает, что Java все еще может иметь утечки памяти, если вы не будете тщательно удалять ссылки из глобальных контекстов, таких как кэши в глобальных хэш-картах и т.д.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top