【MinIO-8.2.1】上传文件触发 OOM 异常【非完美解决方案】

本文介绍了在使用MinIO进行大文件上传时遇到的内存溢出(OOM)问题,并提供了解决方案。通过调整SpringBoot应用的JVM参数,增大Xms和Xmx的值,确保其大于MinIO默认的5GB。同时,为了避免依赖冲突,排除了MinIO依赖中的一些库。示例代码展示了如何使用MinIO Java SDK进行文件上传、删除、列举桶内对象等操作。

使用MinIO上传大文件老是会OOM

受到 https://blog.csdn.net/luo4105/article/details/115296654 提醒 。故此换了一种方式去解决。

MinIO版本

排除一些JAR非必要操作,根据实际情况来。我这边是SpringBoot 2.1.3.RELEASE 搭建。可能引用的其他有重复依赖。故此把MinIO重复的依赖进行了排除

<!-- mini文件存储服务 -->
<dependency>
	<groupId>io.minio</groupId>
	<artifactId>minio</artifactId>
	<version>8.2.1</version>
	<exclusions>
		<exclusion>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
		</exclusion>
		<exclusion>
			<groupId>org.jetbrains.kotlin</groupId>
			<artifactId>kotlin-stdlib</artifactId>
		</exclusion>
		<exclusion>
			<groupId>org.jetbrains.kotlin</groupId>
			<artifactId>kotlin-stdlib-common</artifactId>
		</exclusion>
		<exclusion>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
		</exclusion>
		<exclusion>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
		</exclusion>
	</exclusions>
</dependency>

 Java启动 Xms Xmx 给一个很大的值

最好给的比MinIO的5G大

因此 作者给的为 8*1024 = 8192M

 再次上传接近1G的文件。不会OOM了。

MinIO-8.2.1一些方法示例代码

代码地址:https://gitee.com/xshuai/interview/blob/master/src/main/java/cn/ydxiaoshuai/sample/miniosample/MinIOSample.java

package minio;

import io.minio.*;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;

/**
 * @author 小帅丶
 * @className MinIOSample
 * @Description MinIOSample一些案例测试代码
 * @Date 2021-04-30-15:37
 **/
@Slf4j
public class MinIOSample {
    /** minimum allowed multipart size is 5MiB */
    private static final int MIN_MULTIPART_SIZE = 5 * 1024 * 1024;
    /**
     * MinIO服务的URL
     */
    private static String MINIO_URL = "http://192.168.8.88:9000";
    /**
     * MinIO服务的Access key
     */
    private static String MINIO_AK = "";
    /**
     * MinIO服务的Secret key
     */
    private static String MINIO_SK = "";
    /**
     * MinIO服务的存储桶
     */
    private static String MINIO_BUCKET = "";

    public static void main(String[] args) {
        //文件名称
        String file_name = System.currentTimeMillis() + ".jpg";
        //文件路径
        String file_path = "F://testvideo//";
        // 创建MinioClient对象
        MinioClient minioClient = MinioClient.builder()
                .endpoint(MINIO_URL).credentials(MINIO_AK, MINIO_SK).build();
        try {
            InputStream inputStream = new FileInputStream(new File(file_path+file_name));
            //删除文件
            minioClient.removeObject(RemoveObjectArgs.builder()
                    .bucket(MINIO_BUCKET)
                    .object(file_name)
                    .build());
            //获取某个BUCKET下所有的文件
            Iterable<Result<Item>> myObjects = minioClient.listObjects(ListObjectsArgs.builder()
                    .bucket(MINIO_BUCKET)
                    .useApiVersion1(true)
                    .build());
            for (Result<Item> result : myObjects) {
                Item item = result.get();
                System.out.println(item.objectName());
            }
            //查询文件是否存在-不存在则抛出异常
            StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder()
                    .bucket(MINIO_BUCKET)
                    .object(file_name)
                    .build());
            System.out.println("文件名称:" + statObjectResponse.object());
            //查询全部Bucket
            List<Bucket> buckets = minioClient.listBuckets();
            buckets.forEach(bucket -> {
                System.out.println(bucket.creationDate() + ", " + bucket.name());
            });
            //上传文件(会根据大小自动分片上传)
            ObjectWriteResponse objectWriteResponse = minioClient.putObject(PutObjectArgs.builder()
                    .bucket(MINIO_BUCKET)
                    .object(file_name)
                    .stream(inputStream,
                            inputStream.available(),
                            MIN_MULTIPART_SIZE)
                    .build());
            System.out.println("文件名称:" + objectWriteResponse.object());
            // 检查存储桶是否已经存在
            boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder()
                    .bucket(MINIO_BUCKET)
                    .build());
            System.out.println("存储桶是否已经存在:" + isExist);
        } catch (Exception e) {
            log.info("错误信息-{}", e.getMessage());
        }
    }
}

注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: 中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小帅丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值