Skip to content
This repository has been archived by the owner on Apr 5, 2022. It is now read-only.

OutOfMemoryError from RestTemplate.getForObject #230

Open
kosarko opened this issue May 11, 2017 · 1 comment
Open

OutOfMemoryError from RestTemplate.getForObject #230

kosarko opened this issue May 11, 2017 · 1 comment

Comments

@kosarko
Copy link

kosarko commented May 11, 2017

Summary

When you are fetching large data (imagine drive file with size in GBs) there's a possibility for OutOfMemoryError if the data does not fit on the heap.

Actual Behavior

Caused by: java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:3236)
        at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
        at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
        at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
        at org.springframework.util.StreamUtils.copy(StreamUtils.java:125)
        at org.springframework.util.StreamUtils.copyToByteArray(StreamUtils.java:57)
        at org.springframework.http.converter.ResourceHttpMessageConverter.readInternal(ResourceHttpMessageConverter.java:65)
        at org.springframework.http.converter.ResourceHttpMessageConverter.readInternal(ResourceHttpMessageConverter.java:45)
        at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:153)
        at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:103)
        at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:496)
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:452)
        at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:222)
        at org.springframework.social.google.api.drive.impl.DriveTemplate.downloadFile(DriveTemplate.java:295)

Expected Behavior

When you need to obtain just the InputStream (ie. you are calling restTemplate.getForObject(url, Resource.class).getInputStream()) and save the data to a file on disk; the content should not be kept in memory.

The call originates from spring-social-google, but that just calls OAuth2Template.createRestTemplate, which looks like a reasonable default.

Setting setBufferRequestBody(false) on the ClientHttpRequestFactory as suggested in https://jira.spring.io/browse/SPR-7909 might solve this issue, but I'm unsure whether there are other consequences to that.

Version

1.1.4.RELEASE

@habuma
Copy link
Contributor

habuma commented Jun 15, 2017

This isn't precisely a Spring Social issue. From what I understand, it is more related to RestTemplate from the Spring Framework project. Even if the fix is to call setBufferRequestBody(false), that fix would need to be made in Spring Social Google (which is a community-led project, not an officially supported Spring Social project).

I suggest bringing this issue up at https:/spring-social/spring-social-google.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Development

No branches or pull requests

2 participants