开发者社区 > 云存储 > 对象存储OSS > 正文

OSS下载大文件内存溢出 Throwing OutOfMemoryError with VmSiz

使用Android OSS最新版本库com.aliyun.dpa:oss-android-sdk:2.9.12,流式异步下载440多兆的文件下载57%左右,会导致内存溢出,无法继续下载,SDK没有报任何异常。

系统异常: Throwing OutOfMemoryError with VmSize 2623704 kB "Failed to allocate a 536870924 byte allocation with 25165824 free bytes and 236MB until OOM, max allowed footprint 313698656, growth limit 536870912"

使用如下: OSSCredentialProvider credetialProvider = SmarthomeApplication.getCredetialProvider(); OSSClient oss = new OSSClient(getApplicationContext(), endPoint, credetialProvider);

    GetObjectRequest get = new GetObjectRequest(bucketName, fileName);

   
    get.setProgressListener((request, currentSize, totalSize) -> {

    });

    oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {}

展开
收起
ssy_android 2022-07-27 15:18:11 1340 0
1 条回答
写回答
取消 提交回答
  • 全栈JAVA领域创作者

    这个错误是由于内存溢出导致的。根据错误信息,系统尝试分配了536870924字节的内存,但是只有25165824字节可用,而且系统允许的最大_footprint为313698656字节,增长限制为536870912字节。
    由于这个错误发生在使用OSSClient的getObjectRequest方法时,建议您尝试使用以下几种方法来解决这个问题:

    增加OSSClient的内存分配量。您可以通过设置ossClient的设置项来增加内存分配量。例如,您可以使用以下代码设置OSSClient的内存分配量:
    java
    Copy code
    ossClient.setConnectionPoolMaxSize(1000000);
    这将设置OSSClient的最大连接池大小为1000000。

    减少OSSClient的缓存。您可以通过设置OSSClient的缓存设置项来减少缓存。例如,您可以使用以下代码设置OSSClient的缓存大小:
    java
    Copy code
    ossClient.setConnectionPoolMaxSize(1000000);
    这将设置OSSClient的最大连接池大小为1000000,同时还可以设置缓存大小为0,以减少缓存。

    1. 使用更大的内存。如果您的设备有足够的内存,您可以尝试使用更大的内存来解决内存溢出问题。
    2. 尝试使用其他OSS客户端。如果上述方法都无法解决问题,您可以尝试使用其他OSS客户端,例如Apache HttpComponents等。

    希望这些信息能够帮助您解决问题。

    2023-07-16 07:58:34
    赞同 展开评论 打赏

相关产品

  • 对象存储
  • 热门讨论

    热门文章

    相关电子书

    更多
    云存储之OSS实战进阶分享 立即下载
    OSS运维进阶实战手册 立即下载
    《OSS运维基础实战手册》 立即下载