一、JVM 参数调优(关键)
启动时添加参数(示例)
java -XX:+UseZGC
-Xms256m -Xmx512m
-XX:MaxMetaspaceSize=128m
-XX:NativeMemoryTracking=summary
-XX:+AlwaysPreTouch
-jar your-app.jar
参数说明:
-XX:+UseZGC:低延迟垃圾收集器(适合响应式应用)
-Xms256m -Xmx512m:堆内存初始/最大值(根据监控数据调整)
-XX:MaxMetaspaceSize=128m:限制元空间内存泄漏
二、响应式编程优化
背压控制(防止内存溢出)
Flux chatStream = assistant.chat(sessionId, message)
.limitRate(100) // 限制每批次处理量
.onBackpressureBuffer(500); // 设置缓冲区上限
内存敏感操作符
// 在 LangChain4j 流处理中使用
.windowTimeout(50, Duration.ofMillis(100)) // 按数量/时间分窗
.flatMapSequential(this::processChunk, 5) // 控制并发度
三、LangChain4j 专项优化
模型加载策略
application.yml
langchain4j:
chat-model:
qwen:
max-retries: 2 # 减少重试内存占用
log-requests: false # 关闭请求日志
temperature: 0.7 # 降低随机性可减少计算资源
向量存储优化
@Bean
public ContentRetriever contentRetrieverPinecone() {
return EmbeddingStoreContentRetriever.builder()
.maxResults(20) // 限制召回结果数量
.minScore(0.6) // 过滤低质量结果
.build();
}
四、依赖项瘦身
@Bean
public Caffeine<Object, Object> caffeineConfig() {
return Caffeine.newBuilder()
.maximumSize(500) // 严格控制缓存条目
.expireAfterWrite(5, TimeUnit.MINUTES)
.softValues(); // 使用软引用缓存
}
}
七、类加载优化
@SpringBootApplication
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class)
.lazyInitialization(true) // 启用懒加载
.run(args);
}
}
八、容器化优化(如需部署)
FROM eclipse-temurin:21-jre-alpine
RUN apk add --no-cache musl-locales
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT [“java”,
“-XX:MaxRAMPercentage=75.0”,
“-XX:+UseContainerSupport”,
“-jar”,“/app.jar”]
优化效果验证:
使用 jconsole 观察堆内存变化
通过 /actuator/metrics/jvm.memory.used 监控实时内存
使用 async-profiler 生成火焰图定位热点
针对 AI 服务的特别建议:
// 在 Assistant 接口添加内存敏感注解
@AiService(/原有配置/)
public interface Assistant {
@SystemMessage(fromResource = "agent-prompt.txt")
@UserMessage(maxTokens = 500) // 限制生成长度
Flux<String> chat(@MemoryId String memoryId,
@UserMessage String userMessage);
}