Сборка мусора Java для идеального объекта

@Service
public class test(){
    public Map<String, String> map= new HashMap<>();
}

в веб-приложении, использующем Spring, я аннотировал класс с помощью @Service и определил глобальную карту переменных и вставил в нее значения.

Я предположил

карта хранит вставленные значения до тех пор, пока кто-нибудь не перезапустит сервер или не удалит их с помощью map.remove();

но мой старший сказал мне, что это будет держаться только некоторое время после некоторого идеального времени, и сборщик мусора удалит его примерно через 2 или 3 дня, это правда?


person rockey 123    schedule 31.10.2016    source источник
comment
правда ли это звучит весьма сомнительно; вы должны попросить у него объяснений (вы узнаете что-то так или иначе: что это реальная проблема и вот почему; или что вы не должны слушать этого человека). Но в любом случае то, что вы пытаетесь сделать, тоже выглядит сомнительно.   -  person Andy Turner    schedule 31.10.2016
comment
привет просто забудьте о том, что я пытаюсь или требования! когда класс, аннотированный @service и глобальная переменная в нем, будет хранить данные до тех пор, пока сервер не остановится, или через несколько дней он будет удален??   -  person rockey 123    schedule 31.10.2016
comment
кроме того, я не знаю, как вы понимаете глобальную переменную (я бы сказал, что она должна быть статической, но это не ваш случай). Если Spring не выпускает Bean, который действует как служба, сборка мусора не произойдет. Возможно, Spring убивает неиспользуемые сервисные компоненты и просто создает новый, если это необходимо через некоторое время, но это выходит за рамки моего знания   -  person Antoniossss    schedule 31.10.2016
comment
хорошо, спасибо ! но даже Maybe Spring убивает неиспользуемые сервисные компоненты и просто создает - этого не должно происходить из-за вариантов использования. что я знаю, так это то, что пока на объект не будет ссылки, сборщик мусора не коснется его. Поправьте меня, если я ошибаюсь   -  person rockey 123    schedule 31.10.2016
comment
Нет сильной ссылки, если быть точным, и да, не должно быть.   -  person Antoniossss    schedule 31.10.2016
comment
По умолчанию Spring создаст вашу службу с одноэлементной областью действия. См. раздел stackoverflow.com/questions/ 37605010/ — они никогда не удаляются сборщиком мусора. Тем не менее, ваше приложение может... теоретически... использовать настраиваемые области Spring или заставлять службы быть областью прототипа, что изменит это поведение - вам придется спросить своего старшего, так ли это.   -  person David Lavender    schedule 31.10.2016
comment
И вот ваш ответ. Ты лучше попроси своего старшего товарища объяснить это, не прибегая к черной магии :)   -  person Antoniossss    schedule 31.10.2016
comment
проблема в том, что он ничего не знает и ничего не объяснит до тех пор, пока вы не станете самкой любого живого существа на земле. попробую сам разобраться спасибо   -  person rockey 123    schedule 31.10.2016
comment
@ rockey123 Можете ли вы проверить мой ответ ниже?   -  person developer    schedule 31.10.2016
comment
A @Service по умолчанию имеет область действия Singleton.. Синглтон создается один раз, а затем сохраняется до тех пор, пока существует контейнер.   -  person JimmyB    schedule 31.10.2016


Ответы (2)


(1) Содержит ли Map вставленные значения до тех пор, пока кто-нибудь не перезапустит сервер или не удалит его с помощью map.remove() ?

Да, вы правы, данные будут доступны до перезапуска сервера или вызова map.remove() или map.clear().

(2) Он будет храниться только в течение некоторого времени после некоторого идеального времени, и сборщик мусора удалит его, например, через 2 или 3 дня, это правда?

Нет, это неправильно, сборщик мусора не очистит объект, пока вы не вызовете remove() или clear() на Map. Данные могут помещаться/удерживаться на карте до тех пор, пока это не будет разрешено (т. е. до максимального размера кучи), и после этого вы получите исключения OutOfMemory на сервере.

P.S.: Но один момент, который вам нужно знать, это то, что НЕ рекомендуется хранить такие данные в карте внутри службы, скорее вам следует рассмотреть механизмы кэширования (Ehcache, HazelCast и т. д.). ..) для кэширования/хранения данных, которые предоставляют расширенные функции, такие как истечение срока действия кэша, распределение данных по серверам и т. д..

person developer    schedule 31.10.2016
comment
Небольшое исправление: Map — это всего лишь интерфейс, поэтому вполне возможно, что реализация позволит некоторым записям быть GCd при определенных условиях. (java.util.WeakHashMap является одним из таких примеров.) Это конкретная Map реализация HashMap, которая хранит строгие ссылки на ключи и значения, предотвращая их сборку мусора до тех пор, пока они не будут удалены или сама карта не станет недоступной. - person biziclop; 31.10.2016

Карта содержит список адресов в памяти. Эти адреса содержат значения, которые вы храните, используя

map.put(object);

каждый раз, когда вы хотите получить определенное значение, которое вы сохранили в памяти, вы передаете адрес места, где вы сохранили свое значение, и в результате вы получаете сохраненное значение.

Возвращаясь к вашему вопросу, когда вы удаляете значение с карты, на самом деле происходит то, что вы теряете адрес местоположения, в котором хранится ваше значение. И другого способа получить доступ к этому значению больше нет. Хотя значение все еще находится в памяти, но вы не можете его использовать, так как вы удалили адрес его местоположения. Сборщик мусора сбросит это значение, но принудительно запустить сборщик мусора нельзя. Лучшее, что вы можете сделать, это вызвать System.gc(), который просто намекает сборщику мусора, что вы хотите, чтобы он выполнил сборку. И он будет работать в любое случайное время или когда JVM требует больше памяти.

Поскольку ваш старший упомянул, что сборщик мусора будет через 2-3 дня, я полагаю, он просто говорит гипотетически, потому что вы никогда не знаете, когда сборщик мусора запустится и очистит память.

person Ali Hassan    schedule 31.10.2016
comment
хорошо, мой вопрос в том, если я помещу некоторые 10 значений в карту. Он говорит, что эти 10 значений будут собраны мусором через 2-3 дня, и я считаю, что они не будут, пока мы не удалим их с помощью remove () или не выключим сервер или объект - person rockey 123; 31.10.2016
comment
О да! если у вас есть значения, хранящиеся в некоторой структуре данных или в каком-либо объекте, значения не будут доступны для сборки мусора, если вы не вызовете для него удаление или удаление или если вы перекомпилируете код. Даже если у вас есть один экземпляр приложения, работающий месяцами, и вы используете не какую-либо базу данных для хранения значений, а свои собственные структуры данных и объекты. Если вы не закроете или не перезапустите приложение, ваши данные останутся в объектах и ​​не будут доступны для сборки мусора. - person Ali Hassan; 31.10.2016