Search code examples
javatomcatjerseyout-of-memorydocushare

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


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?


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();