Java Spring spring microservice running out of heap size on kubernetes

2/6/2020

So I developed a spring boot microsservice, that accepts a multipart file and then forwards it to another service that is running outside of kubernetes network.
When I upload file larger than 20mb I get the following error:

java.lang.OutOfMemoryError: Java heap space
    at java.base/java.util.Arrays.copyOf(Unknown Source) ~[na:na]
    at java.base/java.io.ByteArrayOutputStream.grow(Unknown Source) ~[na:na]
    at java.base/java.io.ByteArrayOutputStream.ensureCapacity(Unknown Source) ~[na:na]
    at java.base/java.io.ByteArrayOutputStream.write(Unknown Source) ~[na:na]
    at org.springframework.util.StreamUtils.copy(StreamUtils.java:143) ~[spring-core-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
    at org.springframework.http.converter.ResourceHttpMessageConverter.writeContent(ResourceHttpMessageConverter.java:132) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
    at org.springframework.http.converter.ResourceHttpMessageConverter.writeInternal(ResourceHttpMessageConverter.java:124) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
    at org.springframework.http.converter.ResourceHttpMessageConverter.writeInternal(ResourceHttpMessageConverter.java:45) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
    at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:227) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
    at org.springframework.http.converter.FormHttpMessageConverter.writePart(FormHttpMessageConverter.java:417) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
    at org.springframework.http.converter.FormHttpMessageConverter.writeParts(FormHttpMessageConverter.java:393) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
    at org.springframework.http.converter.FormHttpMessageConverter.writeMultipart(FormHttpMessageConverter.java:373) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
    at org.springframework.http.converter.FormHttpMessageConverter.write(FormHttpMessageConverter.java:277) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
    at org.springframework.http.converter.FormHttpMessageConverter.write(FormHttpMessageConverter.java:95) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]
    at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:948) ~[spring-web-5.1.9.RELEASE.jar!/:5.1.9.RELEASE]

The service itself doesnt crash. The amount of ram shouldn't be an issue. At first I set it up to be 512MB and then increased it to 1024MB

   limits:
     cpu: 200m
     memory: 1024Mi
   requests:
     cpu: 200m
     memory: 1024Mi

The java code handling the upload:

params.add("file", new MultipartInputStreamFileResource(multipartfile.getInputStream(),
                    multipartfile.getOriginalFilename()));

            UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(requestUrl);
            for (Entry<String, List<Object>> entry : params.entrySet()) {
                builder.queryParam(entry.getKey(), entry.getValue());
            }

            HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
            restTemplate.postForObject(requestUrl, requestEntity, String.class);

Java spring is running at default settings. I only increased tomcat's max upload file...

-- Kristjan
java
kubernetes
spring
spring-boot

0 Answers