>>106402343 (OP)
well you obviously cant explicitly free memory because the vm is cucked but you could do something like this:
import java.lang.ref.Cleaner;
import jdk.internal.ref.CleanerFactory; // used by JDK; in apps use Cleaner.create()
public final class SensitiveBuffer implements AutoCloseable {
private static final Cleaner CLEANER = CleanerFactory.cleaner(); // or Cleaner.create()
private byte[] data;
private Cleaner.Cleanable cleanable;
private volatile boolean destroyed;
private static final class Zeroer implements Runnable {
private byte[] data;
Zeroer(byte[] data) { this.data = data; }
@Override public void run() {
if (data != null) {
java.util.Arrays.fill(data, (byte) 0);
data = null;
}
}
}
public SensitiveBuffer(int size) {
this.data = new byte[size]; // on-heap
this.cleanable = CLEANER.register(this, new Zeroer(data));
}
public byte read(int i) {
try {
checkAlive();
return data[i];
} finally {
java.lang.ref.Reference.reachabilityFence(this);
}
}
private void checkAlive() {
if (destroyed) throw new IllegalStateException("Destroyed");
}
// Deterministic “destructor”
@Override public void close() {
if (!destroyed) {
destroyed = true;
// invoke cleanup now
cleanable.clean();
cleanable = null;
// make object unusable
data = null;
}
}
}