java / intermediate
Snippet
Verwalten von Off-Heap Direct-ByteBuffers im Prototype-Bean-Lebenszyklus
Die Allokation von Off-Heap-Speicher über `ByteBuffer.allocateDirect` entlastet den Java-Garbage-Collector, erfordert jedoch ein diszipliniertes manuelles Lebenszyklusmanagement. In Spring können Beans mit Prototype-Scope, die nativen Speicher allozieren, das `DisposableBean`-Interface implementieren, um Bereinigungs-Hooks bereitzustellen. Da Spring den Zerstörungszyklus von Prototype-Beans nicht automatisch steuert, leeren explizite Zerstörungsaufrufe über `destroy()` native Speicherreferenzen.
snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Component@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)public class DirectMemoryBufferPool implements DisposableBean {private ByteBuffer offHeapBuffer;public void initializeBuffer(int capacityBytes) {this.offHeapBuffer = ByteBuffer.allocateDirect(capacityBytes);}public ByteBuffer acquireBuffer() {return this.offHeapBuffer.duplicate();}@Overridepublic void destroy() {if (this.offHeapBuffer != null && this.offHeapBuffer.isDirect()) {this.offHeapBuffer.clear();this.offHeapBuffer = null;}}}
spring
Erklärung
1
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
Stellt sicher, dass pro Anforderung eine neue Pufferinstanz erzeugt wird, anstatt ein globales Singleton zu teilen.
2
this.offHeapBuffer = ByteBuffer.allocateDirect(capacityBytes);
Alloziert nativen, unverwalteten Off-Heap-Speicher außerhalb des standardmäßigen JVM-Heap-Bereichs.
3
public void destroy()
DisposableBean-Lebenszyklus-Hook, der bei manueller Bereinigung ausgeführt wird, um Objektreferenzen freizugeben.