从内存中删除变量

问题描述 投票:0回答:4

我有三个数组变量

a[dynamic], b[dynamic], c[dynamic]
。它们可以是任何大小。我想销毁其中一个变量(例如
a
),因为我不会再使用该变量。

java memory memory-management
4个回答
24
投票

您可以通过向垃圾收集器分配

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

    一个变量(或对象字段或数组元素)。

    在分配 

    System.gc()
  • 后尝试通过调用
  • null

    强制 GC 运行是非常不可取的……或者永远

    2
    。如果电话有任何影响的话,费用可能会很高。最好让 JVM 在最佳时间安排 GC。
    
    
    
    

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

请注意,几乎任何东西都技术上

符合JLS要求......前提是GC不删除可到达的(即非垃圾)对象。其中包括使用 Epsilon no-op GC 的 JVM,它从不收集垃圾,并在空间不足时终止 JVM。

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

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


0
投票

for(Object obj : myObjectArray){ obj = null; }

然后将数组引用设为空

myObjectArray = null;

如果,对于您的问题空间,变量只需要在一定范围的代码范围内,块可能对您有用,因为在块的末尾,任何“离开”范围的变量都被告知(最终)被垃圾收集器删除。

0
投票

从 arrayList 中删除所有元素 

-1
投票
arrayList.removeAll(arrayList);


© www.soinside.com 2019 - 2024. All rights reserved.