springboot用MultipartFile上传文件后,/tmp/磁盘空间没有释放

image

lsof查看号好多临时文件,磁盘空间

大佬们有什么解决方案

文化后面那个 deleted 标识,好像是文件已经被删除,但是句柄一直引用存在所以一直没删除成功。

上传文件,记得在final里面关闭读取流。

每次上传完图片/ 空间一直在加,空间没有释放

可以贴一下上传代码,看看。

for(MultipartFile file:fileList){
				//将文件遍历上传到oss上
				try {
					BladeFile inOutPic = ossService.putFile(null,serverPath,file.getOriginalFilename(),file);
					if(inOutPic == null){
						//上传失败,需要记录下来失败的数据
						errorPicList.add(file.getOriginalFilename());
					}
				}catch (Exception ex){
					if(success){
						resCode = "-1";
						success = false;
						resMessage = "有图片未上传成功,请重试!";
					}
					errorPicList.add(file.getOriginalFilename());
					continue;
				}
			}
public BladeFile putFile(String bucketName, String filePath, String fileName, MultipartFile file) {
		if (StringUtil.isBlank(fileName)) {
			fileName = file.getOriginalFilename();
		}
		InputStream stream = file.getInputStream();
		BladeFile bladeFile = putFile(bucketName, filePath, fileName, 0, stream);
		// 使用完关闭文件流
		stream.close();
		return bladeFile;
	}
public BladeFile putFile(String bucketName, String filePath, String fileName, long fileLength, InputStream stream) {
		client.putObject(bucketName, fileName.substring(1), stream);
		BladeFile file = new BladeFile();
		file.setOriginalName(fileName);
		file.setName(fileName);
		file.setLink(this.fileLink(bucketName, fileName));
		return file;
	}

在finaly里面关闭试试看。

public void upload (MultipartFile[] multipartFiles) {
	for (MultipartFile file : multipartFiles) {
		try {
			// TODO 
		} finally {
			try {
				file.getInputStream().close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

空间还是会一直增加


这按道理来说,Undertow应该会自动释放的。我也不确定是啥问题导致的。

可以通过Linux命令查看文件句柄的线程ID,把线程dump下来看看。根据进程ID,找找,到底是哪里占用了文件。

根据pid找了下,是java占用的,kill掉pid 重启java空间才能释放

应该是释放了,有点看不懂

1 Like

Undertow multi-part upload can potentially leak file descriptors

我找到了这个类似的
image

1 Like

:hot_face:需要订阅?裂开了