У вас есть один большой объект в java. у него есть 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
Это невозможно в Java.
Если у вас есть сильная ссылка, ссылающаяся на ваш объект, вы не можете заставить JVM к GC этому объекту. Это просто не может гарантировать, что программа будет работать.
Если коды всех других ссылок находятся под вашим контролем, рассмотрите возможность их изменения для использования WeakReference
или SoftReference
Вы можете попробовать Finalize()
или System.runFinalization()
но, откровенно говоря, если есть ссылки, все еще указывающие на объект, тогда я думаю, что GC проигнорирует ваш запрос.
Вы можете объявить свои объекты как 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");
}
Управление памятью Java просто построено для предотвращения этого. Объект гарантированно проживает до тех пор, пока существует ссылка на этот объект. Насколько я знаю, нет (официального) способа узнать другие ссылки на объект (и в этом не должно быть необходимости).
Трудно ответить, не зная вашего варианта использования, но если есть одно место, которое вы хотите удалить, с этого момента вы можете сохранить любую другую ссылку на него как WeakReference. Java обычно использует сильные рефренсы при привязке объектов, и GC будет только что-то прояснять, если у нее нет более сильных ссылок. Однако, если вы используете WeakRefrences, и ваше сильное отрицание никогда не выходит из сферы действия, нет никакой гарантии, что ваши данные останутся, даже если они еще нужны.
Я мог ошибаться в этом, хотя я не использовал этот класс через год или два.
На WeakReferences: http://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html
Есть некоторые вещи, которые не в наших руках, и лучше оставить его в JRE, чтобы справиться с этим. Все, что мы можем сделать, мы убеждаемся, что мы сделаем их null
явно после их использования.
{
// Some block
HugeObject obj = HugeObject.getInstance();
// Use it
obj = null;
}
// end of block
В Java GC (сборщик мусора) обрабатывается очистка кучи. Если у объекта нет живых ссылок на него, он автоматически очищается. Поэтому вам нужно убедиться, что ссылки на объект отсутствуют.
Сделать его null
является одним из способов. Но это не гарантирует его очистки, если есть другой объект, указывающий на ту же ссылку. Вот почему для написания хорошего кода необходимо закрыть все ресурсы после использования, включая включение его в null.
Если вы работаете с низкой загрузкой, вы можете попробовать увеличить размер кучи или вызвать System.gc()
но снова вызов gc вручную не гарантирует, что gc фактически будет выполнен. это зависит от множества параметров, зависящих от JVM.
Какими ссылками они ссылаются на объект? Являются ли эти ссылки созданными вами и во время выполнения, вы не отслеживаете эти ссылки. Если это так, вы можете привязать свои ссылки к объекту в мягкой/слабой ссылке, а затем явно запустить запрос GC. В противном случае, во время выполнения, если какой-либо прямой поток имеет доступ к объекту. GC не удаляет этот объект.