java / intermediate
Snippet
Managing Transient State Memory with ObjectProvider and Prototype Scopes
Injecting ObjectProvider instead of direct prototype beans avoids holding long-lived references inside singleton services. This pattern lazily instantiates stateful objects on demand and allows the JVM garbage collector to reclaim large internal buffers as soon as local execution finishes.
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
Breakdown
1
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
Instructs Spring to instantiate a fresh, independent instance with separate heap allocation for each request.
2
private final ObjectProvider<HeavyReportProcessor> processorProvider;
Provides on-demand lazy factory retrieval of prototype beans without creating circular or retained references in singletons.
3
HeavyReportProcessor processor = processorProvider.getObject();
Constructs a new transient instance scoped to the local stack frame.