0 Tage Serie
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 buffer
public void process(ReportRequest request) {
// Heavy stateful processing
}
}
@Service
public 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 collection
processor = 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.