Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从堆中删除java对象?_Java_Jvm_Heap Memory - Fatal编程技术网

如何从堆中删除java对象?

如何从堆中删除java对象?,java,jvm,heap-memory,Java,Jvm,Heap Memory,java中有一个大对象。它有四五个参考文献。你不知道所有的参考资料。在删除时,您只知道一个引用,并且希望完全删除该对象。如何做到这一点?另外,如果你想知道其他参考资料,那么最好的方法是什么。这不在我们手中。。你可以把它从你这一方取消 Object a = new Object(); a = null; // after that, if there is no live thread which is accessing members,it will be deleted by garbage

java中有一个大对象。它有四五个参考文献。你不知道所有的参考资料。在删除时,您只知道一个引用,并且希望完全删除该对象。如何做到这一点?另外,如果你想知道其他参考资料,那么最好的方法是什么。

这不在我们手中。。你可以把它从你这一方取消

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

您可以尝试
Finalize()
System.runFinalization()
,但坦率地说,如果仍有引用指向该对象,那么我认为GC将忽略您的请求。

有些事情不在我们手中,最好让JRE来处理。我们所能做的就是确保在使用它们之后显式地将它们设置为
null

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

Java内存处理就是为了防止这种情况而构建的。只要存在对该对象的引用,就保证该对象存在。据我所知,没有(正式的)方法来了解对对象的其他引用(应该没有必要)。

这在Java中是不可能的

如果有引用对象的强引用,则不能强制JVM对该对象进行GC。它根本无法保证该计划能起作用

如果所有其他引用的代码都在您的控制范围内,请考虑在java GC(垃圾收集器)中使用“<代码> WeakReference < /COD> >或 SOFTRISEON//COMPUT>

< P>处理堆清理。如果一个对象没有对它的活动引用,那么它将被自动清除。因此,您需要确保没有对对象的活动引用

将其设为空是一种方法。但是,如果有其他对象指向同一引用,则不能保证它是清理的。这就是为什么编写好的代码需要在使用后关闭所有资源,包括将其设置为null


如果堆资源不足,可以尝试增大堆大小或调用
System.gc()
,但再次手动调用gc不能保证实际执行gc。它取决于许多依赖于JVM的参数。

这些参数对对象的引用是什么?这些引用是由您创建的,并且在运行时您不跟踪这些引用。如果是这种情况,您可以将对对象的引用包装为软/弱引用,然后显式运行GC请求。否则,在运行时,如果任何活动线程都可以访问该对象。GC不会删除该对象。

不知道您的用例很难回答,但是如果您希望能够从某个位置删除该对象,那么您可以将对该对象的所有其他引用存储为WeakReference。Java在引用对象时通常使用强引用,而GC只在不再具有强引用时清除某些内容。但是,如果您使用的是弱引用,并且您的强引用超出了范围,则无法保证您的数据会保留下来,即使它仍然是需要的

但我可能会弄错,因为我已经一两年没上过这门课了

关于weakreference:

您可以将对象声明为
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");
      }
/**
初始化引用队列,即使不初始化,也没有问题。将采用默认引用队列。
**/
ReferenceQueue weakObject=新的WeakReference(demoHashMap、testReferenceQueue);
demoHashMap.clear();
demoHashMap=null;//此对象未从任何位置引用
if(weakObject!=null){
System.out.println(“对象还不是GCd”);
}否则{
System.out.println(“它已经被垃圾收集”);
}

字符串呢