如何从Heap中删除java对象?

时间:2014-04-28 06:31:15

标签: java jvm heap-memory

你在java中有一个大对象。它有4或5个参考。你不知道所有这些参考文献。在删除时,您只知道一个引用,并且您想要完全删除该对象。怎么实现呢?如果你想知道其他参考文献,那么最好的方法是什么。

9 个答案:

答案 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该对象。它根本无法保证程序能够正常工作。

如果您控制所有其他参考文献的代码,请考虑将其更改为使用WeakReferenceSoftReference

答案 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");
      }