Java 删除可变内存 a[动态],b[动态],c[动态] < /代码>。它们可以是任意大小,现在我想销毁变量,比如a。我确信我不会再使用这个变量了。欢迎您提出任何想法和建议。

Java 删除可变内存 a[动态],b[动态],c[动态] < /代码>。它们可以是任意大小,现在我想销毁变量,比如a。我确信我不会再使用这个变量了。欢迎您提出任何想法和建议。,java,memory,memory-management,Java,Memory,Memory Management,您可以向垃圾收集器指示,可以通过为数组分配null来释放该数组: int[] a = new int[someSize]; int[] b = new int[someSize]; .... // I no longer need 'a' a = null; // ... but I can still use 'b' 但是,有一些事情需要注意: 这并没有释放空间。相反,它使数组有资格被垃圾收集器释放。GC可能在很长一段时间内都无法释放它 事实

您可以向垃圾收集器指示,可以通过为数组分配
null
来释放该数组:

    int[] a = new int[someSize];
    int[] b = new int[someSize];
    ....
    // I no longer need 'a'
    a = null;
    // ... but I can still use 'b'
但是,有一些事情需要注意:

  • 这并没有释放空间。相反,它使数组有资格被垃圾收集器释放。GC可能在很长一段时间内都无法释放它

  • 事实上,数组只有在不可访问时才有资格进行垃圾收集。如果已将对数组的引用分配给另一个(仍然有效)变量或可访问对象,则GC不会回收它

  • 在现实生活中的Java应用程序中这样做几乎没有任何意义。在正常的计算过程中,允许变量超出范围是正常的做法1。如果一个变量(或对象字段或数组元素)在很长一段时间内不会超出范围,并且它引用了一个大型数组/对象或网络,那么您只能显式地
    null
    这样的变量

  • 在分配
    null
    之后,试图通过调用
    System.GC()
    来强制GC运行是非常不明智的。。。或者每2次。如果这个电话有任何影响的话,它很可能是昂贵的。最好让JVM在最佳时间安排GC


1-任何合理的JVM实现都会知道,当方法退出时,局部变量超出范围。JVM是否以更精细的粒度跟踪作用域是特定于实现的,而且(老实说)我不知道JVM在实践中如何处理这一点

请注意,几乎所有内容都符合JLS要求。。。。前提是GC不删除可访问(即非垃圾)对象。这包括一个使用Epsilon no op GC的JVM,它从不收集垃圾,并在JVM耗尽空间时终止JVM


2-唯一合法的理由是:1)测试GC相关功能的行为;e、 g.终结器、引用队列处理器等,或2)避免实时应用程序中有害的GC暂停;e、 g.在实时游戏中更改“级别”时运行GC。

Stephen C已经回答了您的问题,但对于非原语类型,您还希望确保数组中的所有对象都标记为null(如果您不需要),这将确保您没有内存泄漏

比如:

for(Object obj : myObjectArray){
  obj = null;
}
然后将数组引用设为null

myObjectArray = null;

从arrayList中删除所有元素的步骤


arrayList.removeAll(arrayList)

为什么要这样做?你明白垃圾收集器的作用吗?我猜你正在从C语言转向java!!是的,我很在行。。实际上,只有当变量的生命周期结束时,变量才会被销毁。@Eric:不是这样,我需要知道有什么方法可以减少占用的内存。对数组的引用为null后,所有数组索引都将无法访问。首先将它们设置为null没有任何影响。现在,可能还有其他对数组或其索引的引用,但这是一个单独的问题,与此无关。@entonio-同意。在大多数情况下,调零是不必要的,如果不必要,那就是浪费CPU周期。除此之外,您总是有可能过早或过激地错误地
null
事情。在我看来,我们最好不要这样做。。。除非您有充分的理由相信不置零将导致严重的内存泄漏。