java / intermediate
Snippet
Verwaltung transienten Speichers mit ObjectProvider und Prototype-Scopes
Die Injektion von ObjectProvider anstelle direkter Prototype-Beans verhindert, dass langlebige Singleton-Services Referenzen dauerhaft halten. Dieses Vorgehen instanziiert speicherintensive Objekte erst bei Bedarf und ermöglicht dem Garbage Collector die Freigabe interner Puffer direkt nach der Methodenabarbeitung.
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
23
24
25
26
27
28
@Component@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)public class HeavyReportProcessor {private final byte[] scratchBuffer = new byte[1024 * 1024]; // 1MB bufferpublic void process(ReportRequest request) {// Heavy stateful processing}}@Servicepublic class ReportManager {private final ObjectProvider<HeavyReportProcessor> processorProvider;public ReportManager(ObjectProvider<HeavyReportProcessor> processorProvider) {this.processorProvider = processorProvider;}public void handleReport(ReportRequest request) {HeavyReportProcessor processor = processorProvider.getObject();try {processor.process(request);} finally {// Discard reference immediately for GC collectionprocessor = null;}}}
spring
Erklärung
1
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
Weist Spring an, für jede Anforderung eine neue, eigenständige Instanz mit separater Heap-Allokation zu erzeugen.
2
private final ObjectProvider<HeavyReportProcessor> processorProvider;
Ermöglicht den bedarfsgesteuerten Abruf von Prototype-Beans, ohne dauerhafte Referenzen im Singleton zu halten.
3
HeavyReportProcessor processor = processorProvider.getObject();
Erstellt eine neue transiente Instanz, die nur im lokalen Stack-Frame gültig ist.