spe*_*ial 8 java memory memory-management
嗨,我认为我有三个数组变量a[dynamic], b[dynamic], c[dynamic]
.它们可以是任何大小,现在我想破坏变量说a.我相信我不会再使用变量了.欢迎任何想法和建议.
Ste*_*n C 19
您可以通过分配null
给垃圾收集器指示可以释放数组:
int[] a = new int[someSize];
int[] b = new int[someSize];
....
// I no longer need 'a'
a = null;
// ... but I can still use 'b'
Run Code Online (Sandbox Code Playgroud)
但是有很多事情需要注意:
这不会释放空间.相反,它使得数组有资格被垃圾收集器释放.GC可能无法长时间释放它.
实际上,如果数组无法访问,则该数组仅适用于垃圾回收.如果您已将该数组的引用分配给另一个(仍然存活的)变量或可访问的对象,则GC将不会回收它.
在现实Java应用程序中这样做很少有任何意义.通常的做法是在计算的正常过程中简单地允许变量超出范围1.null
如果变量不会长时间超出范围并且它引用大型数组/对象或网络,那么您将只显式地表示变量(或对象字段或数组元素).
System.gc()
在分配null
...或永远2之后尝试通过调用强制GC运行是非常不明智的.如果电话有任何影响,可能会很昂贵.最好让JVM在最佳时间安排GC.
1 - 当方法退出时,任何合理的JVM实现都会知道局部变量超出范围.JVM是否以更精细的粒度跟踪范围是特定于实现的,并且(说实话)我不知道 JVM在实践中如何处理这个问题.
请注意,几乎任何东西在技术上都符合JLS要求....前提是GC不会删除可到达的(即非垃圾)对象,其中包含一个没有任何垃圾收集的假设JVM!
2 - 唯一合理的原因是:1)测试GC相关功能的行为; 例如终结器,参考队列处理器等,或2)避免实时应用中的有害GC暂停; 例如,在实时游戏中更改"级别"时运行GC.
归档时间: |
|
查看次数: |
43292 次 |
最近记录: |