java - GCS - 上传较大大小的文件时出现堆错误

标签 java angularjs google-cloud-storage google-cloud-platform

我想将 400MB 的文件上传到 Google Cloud Storage。以下是我用来获取上传网址并在 angularjs 中发布的代码片段

Java Servlet:

UploadOptions opts = UploadOptions.Builder
        .withGoogleStorageBucketName(GCS_BUCKET_NAME);
String url = blobstore.createUploadUrl("/upload", opts);

AngularJS:

$scope.formData.append('file', $scope.filename);

$http.post(uploadUrl, $scope.formData, {
    withCredentials: true,
    headers: {
        'Content-Type': undefined
    },
    transformRequest: angular.identity
})

代码工作正常,直到文件大小约为 100-150MB,当文件大小更大时,我在浏览器控制台中收到以下错误。

无法加载资源:服务器响应状态为 500(Java 堆空间)

我需要做什么才能避免此错误?

最佳答案

正如您在回答我上面的问题时所说,这仅发生在开发中,而不是生产中。我的猜测是,谷歌的 blobstore 代码将整个请求读取到其开发服务器的内存中,但这很难说,因为我们无权访问该代码。如果您需要在开发中测试更大的上传,您可以尝试配置您的开发服务器以使用更多内存启动。看起来我使用 -Xmx512M (在 eclipse 中启动配置的“VM 参数”部分),您甚至可以尝试更多。或者,如果它在开发中并不重要,您可以只测试较小的上传并相信大型上传可以在生产中运行。 :)

仅供引用,如果您决定使用更多内存启动开发服务器:就我而言,一起使用 Eclipse 和 Maven,我必须创建 Maven 自动生成的启动配置的副本并修改该副本,否则 Maven 会覆盖我的配置变化。这也意味着我必须不时手动更新我的副本,例如更新 appengine SDK 时(以反射(reflect)新版本号)。

关于java - GCS - 上传较大大小的文件时出现堆错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38344261/

相关文章:

python-2.7 - 使用python从其他项目访问谷歌云存储桶

java - Jersey 2 - 请求范围绑定(bind)与单例绑定(bind)

java - 检查标签是否为空的方法不起作用

java - 为什么在 java.util.Collections 中声明静态 java.util.Collections.fill() 方法而不是在 java.util.AbstractList 中声明实例方法?

javascript - 在 Controller 中获取每个指定类型的名称

google-cloud-storage - 在自定义位置的 Google Cloud Storage 中创建存储桶

java - 如何在选择菜单项后启用recyclerview OnItemClickListener?

javascript - 如何在 $resource POST 上设置请求正文和参数

javascript - 带有 ng-change 的 Angular 1.5 选项

node.js - 将原始数据上传到 Google Cloud 函数中的 Firebase 存储桶?