Java – How to fix java.lang.OutOfMemoryError: Java heap space error?

docushare, java, jersey, out-of-memory, tomcat

I have a file with size of 32 MB, I have downloaded it from DocuShare server to DocuShare temp folder. I am trying to read the file content from it to create a file. I get error when I URL encode my base64 content.
I am not getting any exception when I run the same code a simple java application. But when I use the same code in DocuShare service to get document content I get Exception.
HTTP Status 500 – org.glassfish.jersey.server.ContainerException: java.lang.OutOfMemoryError: Java heap space

org.glassfish.jersey.server.ContainerException: java.lang.OutOfMemoryError: Java heap space

File file = new File(filePath);FileInputStream fileInputStreamReader = new FileInputStream(file);byte[] bytes = new byte[(int)file.length()];fileInputStreamReader.read(bytes);String encodedBase64 = String encodedBase64 = java.util.Base64.getEncoder().encodeToString(bytes);String urlEncoded = URLEncoder.encode(encodedBase64);

How to fix this error?
Do I need to increase my tomcat heap size?

Best Solution

Base64 converts each 3 bytes into 4 letters. That means you can read your data in chunks and decode it in the same way as you would decode the whole file.

Try this:

       File file = new File(filePath);       FileInputStream fileInputStreamReader = new FileInputStream(file);       StringBuilder sb = new StringBuilder();       Base64.Encoder encoder = java.util.Base64.getEncoder();       int bufferSize = 3 * 1024; //3 mb is the size of a chunk       byte[] bytes = new byte[bufferSize];        int readSize = 0;       while ((readSize = fileInputStreamReader.read(bytes)) == bufferSize) {            sb.append(encoder.encodeToString(bytes));       }       if (readSize > 0) {            bytes = Arrays.copyOf(bytes, readSize);            sb.append(encoder.encodeToString(bytes) );       }       String encodedBase64  = sb.toString();