我一直在阅读这篇关于弱引用的文章。简而言之,
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
我有一些建议可以帮助你销毁这个对象,或者至少让它在垃圾收集之前无法访问。
可以显式调用垃圾收集器。
显式调用垃圾收集器并触发垃圾收集过程有两种方式:
在方法末尾使用系统类方法,例如:
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