你在java中有一个大对象。它有4或5个参考。你不知道所有这些参考文献。在删除时,您只知道一个引用,并且您想要完全删除该对象。怎么实现呢?如果你想知道其他参考文献,那么最好的方法是什么。
答案 0 :(得分: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
答案 1 :(得分:1)
您可以尝试Finalize()
或System.runFinalization()
,但坦率地说,如果有引用仍然指向该对象,那么我认为GC会忽略您的请求。
答案 2 :(得分:1)
在Java中是不可能的。
如果您有引用对象的强引用,则无法强制JVM到GC该对象。它根本无法保证程序能够正常工作。
如果您控制所有其他参考文献的代码,请考虑将其更改为使用WeakReference
或SoftReference
答案 3 :(得分:0)
有一些东西不在我们手中,最好留给JRE来处理它。我们所能做的就是确保我们在使用它们之后明确地使它们null
。
{
// Some block
HugeObject obj = HugeObject.getInstance();
// Use it
obj = null;
}
// end of block
答案 4 :(得分:0)
Java内存处理只是为了防止这种情况而构建。只要对该对象的引用存在,就保证对象存在。据我所知,没有(官方的)方式来了解对象的其他引用(并且不需要这样做)。
答案 5 :(得分:0)
在Java GC(垃圾收集器)中处理堆清理。如果一个Object没有对它的实时引用,那么它将自动被清理。因此,您需要确保没有对象的实时引用。
使它null
是其中一种方式。但是如果有一些其他Object指向同一个引用,它将无法保证它的清理。这就是为什么编写好的代码涉及在使用后关闭所有资源,包括使其为空。
如果你在堆上运行不足,可以尝试增加堆大小或调用System.gc()
,但再次手动调用gc并不能保证实际执行gc。它取决于许多依赖于JVM的参数。
答案 6 :(得分:0)
这些对象有哪些参考?这些引用是由您创建的,并且在运行时您不会跟踪这些引用。如果是这种情况,您可以在soft / weak引用中包装对象的引用,然后显式运行GC请求。否则,在运行时,如果任何活动线程有权访问该对象。 GC不得删除该对象。
答案 7 :(得分:0)
很难回答不知道你的用例,但是如果有一个你希望能够从中移除它的位置,那么你可以将每个其他引用存储为WeakReference。 Java通常在引用对象时使用强引用,而GC只会在没有更强引用时清除某些东西。但是,如果您使用WeakRefrences并且您的强大参考范围超出范围,则无法保证即使仍需要您的数据也会保留。
我可能会对此有所误解,因为我在一两年内没有使用过这门课程。
On WeakReferences: http://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html
答案 8 :(得分: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");
}