Skip to content
$EngineeringAtlas

AWS Lambda Java 25 and SnapStart

How Java 25, SnapStart, CRaC runtime hooks, and startup tuning affect serverless Java APIs on AWS Lambda.

Amit Kumar Singh2 min read

The Problem

Java on Lambda can suffer from cold starts because the JVM, framework, dependency graph, and application initialization all need time before the first request.

Why It Matters

AWS Lambda supports Java 25 and SnapStart for Java runtimes. SnapStart snapshots an initialized execution environment and restores it later, which can dramatically reduce startup latency when used correctly.

Core Concepts

SnapStart captures initialized state for a published function version. CRaC-style runtime hooks let you run code before checkpoint and after restore. Anything that must be unique per execution environment needs restore-time handling.

Implementation

Register runtime hooks for resources that need refresh:

public final class ConnectionResource implements org.crac.Resource {
    public void beforeCheckpoint(org.crac.Context<? extends org.crac.Resource> ctx) {
        connectionPool.close();
    }

    public void afterRestore(org.crac.Context<? extends org.crac.Resource> ctx) {
        connectionPool.reconnect();
    }
}

Publish a version and enable SnapStart on the version, not $LATEST.

Real Project Scenario

A Java API that validates webhook events may be called only a few times per hour, but each call needs a fast response. SnapStart can reduce initialization time by restoring a pre-initialized runtime. The handler still needs to refresh database connections, random seeds, cached credentials, and any network clients that do not survive restore cleanly.

Production Setup

Measure three numbers separately: init duration without SnapStart, restore duration with SnapStart, and handler execution time after restore. Add a canary endpoint that exercises the restored resources so connection problems appear before customer traffic depends on the function.

Common Mistakes

  • Snapshotting stale database connections or credentials.
  • Assuming random values generated before checkpoint are unique after restore.
  • Testing only warm invocations.
  • Forgetting that unused snapshots may need regeneration after idle periods.

Production Considerations

Measure cold start, restore duration, error rate after restore, and downstream connection behavior. Keep function initialization deterministic and visible in logs.

Security

Refresh secrets after restore if they may rotate. Do not bake short-lived tokens into checkpointed state.

Performance

Reduce classpath size, avoid heavy reflection where possible, and initialize only what the handler needs. SnapStart helps most when init work is expensive and stable.

Summary

Java 25 plus SnapStart makes Lambda more attractive for Java APIs, but restore-time resources, secrets, and uniqueness must be designed carefully.

Amit Kumar Singh

// written by

Amit Kumar Singh

Software engineer writing about backend systems, cloud, and the realities of running code in production.

$ subscribe --weekly

The weekly engineering digest

Production-grade engineering writing in your inbox. No spam, unsubscribe anytime.

## related

[Backend]▲ trending

Java 25 for Backend Services

What Java 25 changes for backend teams, including virtual-thread maturity, scoped values, structured concurrency previews, and service upgrades.

Amit Kumar Singh2 min read