我们能否通过将对象放入弱引用并取消引用来使对象弱可达

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

我一直在阅读这篇关于弱引用的文章。简而言之,

WeakReference
可以在任何时间点随机销毁,而
SoftReference
可以坚持一段时间,除非它是
weakly reachable
.

问题:如果我们需要对敏感数据执行操作,我们需要在完成处理之前可用,我们可以在完成后欺骗 jvm 销毁它吗?如果我们使用

WeakReference
,数据可以在我们的操作结束之前消失。如果我们使用
SoftReference
它很可能会坚持一段时间。

我们如何欺骗 JVM?我想知道以下是否可行:

var SensitiveData obj = new SensitiveData();

// ... - perform operations with obj

final WeakReference<SensitiveData> weakObj = new WeakReference(obj); // put the object in a WeakReference so it gets destroyed sooner
obj = null; // dereference the object so it's not reachable from here.
weakObj.clear(); // force object destruction
java jvm weak-references soft-references
1个回答
-2
投票

我有一些建议可以帮助你销毁这个对象,或者至少让它在垃圾收集之前无法访问。

可以显式调用垃圾收集器。

显式调用垃圾收集器并触发垃圾收集过程有两种方式:

在方法末尾使用系统类方法,例如:

System.gc()

使用运行时类方法:

Runtime runtimeObj = Runtime.getRuntime();
runtimeObj.gc();

来源https://www.scaler.com/topics/how-can-we-call-the-garbage-collector-explicitly/

封装

销毁引用的另一种方法是将其封装在一个方法中,在方法完成其操作后,其中的所有内容都将有资格进行垃圾收集。

清除()

在 Java 中调用 WeakReference 对象的 clear() 方法不会立即销毁引用的对象。

相反,调用 clear() 只是删除对该对象的引用,允许它在将来的某个时候被垃圾收集。垃圾收集的确切时间取决于各种因素,例如 JVM 的内存使用情况和垃圾收集的频率。

就像您在上面举例说明的那样,您可以通过将对对象的所有引用设置为“null”来“请求”垃圾收集器删除对象。

一旦不再有对该对象的引用,它就有资格进行垃圾收集。

垃圾收集器然后释放与对象关联的内存并销毁它。

来源https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.6

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