perf(viid):优化线程池配置与图片裁剪内存管理

- 调整线程池核心线程数为8,最大线程数为32,空闲时间10秒- 队列大小从1024降至100,提升响应速度
- 添加CallerRunsPolicy策略,防止任务丢失
- 图片裁剪方法增加try-finally块确保资源释放- 显式调用image.flush()和System.gc()优化内存使用
- ByteArrayOutputStream关闭操作添加异常捕获
-修复潜在的内存泄漏问题
This commit is contained in:
2025-09-27 13:17:48 +08:00
parent ddbc2a0edb
commit f885f734ad
2 changed files with 51 additions and 29 deletions

View File

@@ -101,9 +101,11 @@ public class ViidController {
.setNamePrefix("VIID-" + scenicId + "-t")
.build();
return new ThreadPoolExecutor(
4, 1024, 0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(1024),
threadFactory);
8, 32, 10L, TimeUnit.SECONDS, // 核心2个线程,最大20个线程,空闲60秒回收
new ArrayBlockingQueue<>(1024), // 队列大小从1024降至100
threadFactory,
new ThreadPoolExecutor.CallerRunsPolicy() // 队列满时由调用线程执行,提供背压控制
);
});
}

View File

@@ -28,7 +28,11 @@ public class ImageUtils {
}
public static MultipartFile cropImage(MultipartFile file, int x, int y, int w, int h) throws IOException {
BufferedImage image = ImageIO.read(file.getInputStream());
BufferedImage image = null;
BufferedImage targetImage = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
image = ImageIO.read(file.getInputStream());
log.info("图片宽高:{}", image.getWidth() + "x" + image.getHeight());
log.info("图片裁切:{}@{}", w + "x" + h, x + "," + y);
if (image.getWidth() < w) {
@@ -50,11 +54,27 @@ public class ImageUtils {
targetY = image.getHeight() - h;
}
log.info("图片实际裁切:{}@{}", w + "x" + h, targetX + "," + targetY);
BufferedImage targetImage = image.getSubimage(targetX, targetY, w, h);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
targetImage = image.getSubimage(targetX, targetY, w, h);
ImageIO.write(targetImage, "jpg", baos);
baos.close();
return new Base64DecodedMultipartFile(baos.toByteArray(), "image/jpeg");
} finally {
// 修复内存泄漏:显式释放图片资源
if (image != null) {
image.flush();
image = null;
}
if (targetImage != null) {
targetImage.flush();
targetImage = null;
}
try {
baos.close();
} catch (IOException e) {
log.warn("关闭ByteArrayOutputStream失败", e);
}
// 建议JVM进行垃圾回收
System.gc();
}
}
public static class Base64DecodedMultipartFile implements MultipartFile {