Как удалить объект Java из кучи?

1

У вас есть один большой объект в java. у него есть 4 или пять ссылок. вы не знаете всех этих ссылок. Во время удаления вы знаете только одну ссылку и хотите полностью удалить этот объект. Как это сделать? а также если вы хотите узнать другие ссылки, то для чего это лучший способ.

Теги:
jvm
heap-memory

9 ответов

4

Это не в нашей руке. Вы можете просто свести его с ума.

Object a = new Object();
a = null; // after that, if there is no live thread which is accessing members,it will be deleted by garbage collector
  • 0
    как насчет строк
1

Это невозможно в Java.

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

Если коды всех других ссылок находятся под вашим контролем, рассмотрите возможность их изменения для использования WeakReference или SoftReference

1

Вы можете попробовать Finalize() или System.runFinalization() но, откровенно говоря, если есть ссылки, все еще указывающие на объект, тогда я думаю, что GC проигнорирует ваш запрос.

  • 0
    Да, это будет. В противном случае Java столкнется с такими же ошибками, как C ++ ...
0

Вы можете объявить свои объекты как WeakReference и добавить их в ReferenceQueue. Таким образом, всякий раз, когда ваш объект больше не будет ссылаться, он будет нести ответственность за GC.

    /**
        Initialize the reference queue , even if you don't do it , no problem . Default reference queue will be taken.
        **/
        ReferenceQueue<? super Object> testReferenceQueue = new ReferenceQueue<Object>();

       Map<String,String> demoHashMap = new HashMap<String,String>();

       demoHashMap.put("SomeValue","testValue");
       // Declare the object as weak object and put it in reference queue 
       WeakReference<?> weakObject = new WeakReference<Object>(demoHashMap,testReferenceQueue );

    demoHashMap.clear();  
    demoHashMap = null; // This object is not referenced from anywhere

     if(weakObject!=null){
     System.out.println("Object is not GCd yet");
      }else{
       System.out.println("It is already garbage collected");
      }
0

Управление памятью Java просто построено для предотвращения этого. Объект гарантированно проживает до тех пор, пока существует ссылка на этот объект. Насколько я знаю, нет (официального) способа узнать другие ссылки на объект (и в этом не должно быть необходимости).

0

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

Я мог ошибаться в этом, хотя я не использовал этот класс через год или два.

На WeakReferences: http://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html

0

Есть некоторые вещи, которые не в наших руках, и лучше оставить его в JRE, чтобы справиться с этим. Все, что мы можем сделать, мы убеждаемся, что мы сделаем их null явно после их использования.

{
  // Some block
  HugeObject obj = HugeObject.getInstance();
  // Use it 
  obj = null;
}
// end of block
0

В Java GC (сборщик мусора) обрабатывается очистка кучи. Если у объекта нет живых ссылок на него, он автоматически очищается. Поэтому вам нужно убедиться, что ссылки на объект отсутствуют.

Сделать его null является одним из способов. Но это не гарантирует его очистки, если есть другой объект, указывающий на ту же ссылку. Вот почему для написания хорошего кода необходимо закрыть все ресурсы после использования, включая включение его в null.

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

0

Какими ссылками они ссылаются на объект? Являются ли эти ссылки созданными вами и во время выполнения, вы не отслеживаете эти ссылки. Если это так, вы можете привязать свои ссылки к объекту в мягкой/слабой ссылке, а затем явно запустить запрос GC. В противном случае, во время выполнения, если какой-либо прямой поток имеет доступ к объекту. GC не удаляет этот объект.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню