Was ist das Java-Äquivalent von .net's GC.KeepAlive?

8

.NET hat eine Funktion namens GC.KeepAlive(Object) . Der einzige Zweck besteht darin sicherzustellen, dass die Lebensdauer des referenzierten Objekts so lange anhält, bis der Codefluss den Aufruf erreicht.

Dies ist normalerweise nicht notwendig, es sei denn, man arbeitet mit nativem Code zusammen.

Ich habe eine Situation, in der ich ein Diagramm von C ++ - Objekten habe, auf die über JNI zugegriffen wird, wo bestimmte Root-Objekte am Leben gehalten werden müssen, um die Kinder am Leben zu erhalten. Sowohl die Stammobjekte als auch die untergeordneten Objekte haben Spiegel im JVM-Land. Wenn das Stammobjekt auf der C ++ - Seite (über einen von SWIG generierten Finalizer) gesammelt und freigegeben wird, werden die untergeordneten Objekte jedoch ungültig, da ihr C ++ - Sicherungsobjekt freigegeben wurde.

Dies kann dadurch gelöst werden, dass sichergestellt wird, dass die lokalen Variablen, die das Objektdiagramm verwurzeln, eine Lebensdauer haben, die die letzte Verwendung eines untergeordneten Objekts übersteigt. Ich brauche also eine idiomatische Funktion, die nichts mit einem Objekt zu tun hat, aber nicht wegoptimiert oder bewegt wird (z. B. aus einer Schleife gehisst). Das macht GC.KeepAlive(Object) in .NET.

Was ist die ungefähre Entsprechung in Java?

PS: ein möglicher illustrativer Code:

%Vor%

Das Problem ist, dass der GC, der Parent p freigibt, den Speicher freigibt, der Child zugewiesen ist, während doStuff ausgeführt wird. GC wurde in der Praxis beobachtet. Eine mögliche Korrektur, wenn GC.KeepAlive verfügbar war:

%Vor%

Ich könnte z.B. rufe toString auf p auf, aber ich werde nichts mit seiner Ausgabe machen. Ich könnte p vorübergehend in ein Array stecken, aber woher weiß ich, dass die JVM den Laden nicht verwerfen wird? Etc.

    
Barry Kelly 17.03.2014, 14:28
quelle

1 Antwort

2

Ich denke, Sie könnten JMH verwenden Blackhole dafür. Es wurde entwickelt, um sicherzustellen, dass die Referenz in Benchmarks nicht eliminiert wird, damit es funktioniert.

Im Grunde vergleicht es nur die gegebene Objektreferenz mit einer gespeicherten volatilen Referenz und weist die neuere mit einer kleinen und abnehmenden Wahrscheinlichkeit zu (Speicherung ist teuer, so dass sie minimiert wird).

    
maaartinus 17.03.2014, 16:55
quelle