Java堆空间不足以将其上传于AWS S3文件

问题描述 投票:2回答:2

我试图通过使用Java的AWS API上传的AWS S3的文件。问题是我的应用程序无法执行,因为堆是达到极限上传大型文件。错误:java.lang.OutOfMemoryError:Java堆空间

我个人认为延长堆内存是不是一个永久性的解决方案,因为我要上传文件高达100 GB。我该怎么办 ?

以下是代码片段:

        BasicAWSCredentials awsCreds = new BasicAWSCredentials(AID, Akey);
        AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
        .withRegion(Regions.fromName("us-east-2"))
        .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
        .build();

        InputStream Is=file.getInputStream();

        boolean buckflag = s3Client.doesBucketExist(ABuck);
        if(buckflag != true){
           s3Client.createBucket(ABuck);
        }
        s3Client.putObject(new PutObjectRequest(ABuck, AFkey,file.getInputStream(),new ObjectMetadata() ).withCannedAcl(CannedAccessControlList.PublicRead));
java amazon-web-services spring-boot amazon-s3
2个回答
2
投票

我强烈建议setContentLength()ObjectMetadata,因为:

..如果没有设置,该库将不得不缓冲输入流的内容,以计算它。

(..这可以预见会导致内存不足的“足够大”的文件。)

来源:PutObjectRequest javadoc

适用于您的代码:

 // ...
 ObjectMetadata omd = new ObjectMetadata();
 // a tiny code line, but with a "huge" information gain and memory saving!;)
 omd.setContentLength(file.length());

 s3Client.putObject(new PutObjectRequest(ABuck, AFkey, file.getInputStream(), omd).withCannedAcl(CannedAccessControlList.PublicRead));
 // ...

0
投票

您需要添加示例代码以获得正确的答案。如果你正在处理一个大的物体,使用TransferManager上传,而不是做putObject。

© www.soinside.com 2019 - 2024. All rights reserved.