java - 如何修复 java.lang.OutOfMemoryError : Java heap space error?

标签 java tomcat jersey out-of-memory docushare

<分区>

我有一个大小为 32 MB 的文件,我已将其从 DocuShare 服务器下载到 DocuShare 临时文件夹。我正在尝试从中读取文件内容以创建文件。当我对 base64 内容进行 URL 编码时出现错误。 当我在一个简单的 Java 应用程序中运行相同的代码时,我没有遇到任何异常。但是当我在 DocuShare 服务中使用相同的代码来获取文档内容时,我得到了异常。 HTTP 状态 500 - org.glassfish.jersey.server.ContainerException:java.lang.OutOfMemoryError:Java 堆空间

org.glassfish.jersey.server.ContainerException: java.lang.OutOfMemoryError: Java 堆空间

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

如何解决这个错误? 我需要增加我的 tomcat 堆大小吗?

最佳答案

有两种方法可以解决此问题。

  1. 您可以增加堆大小,但在我看来,这是一个糟糕的解决方案,因为如果您收到多个并行请求或当您尝试处理更大的文件时,您会遇到同样的问题。

    <
  2. 您可以优化您的算法 - 无需在内存中存储文件的多个副本,您可以以流方式处理它,因此内存中的存储量不会超过几个 KB:

    import java.io.InputStream;
    import java.io.OutputStream;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.util.Base64;
    
    public class Launcher {
        public static void main(String[] args) throws Exception {
            final Path input = Paths.get("example");
            final Path output = Paths.get("output");
    
            try (InputStream in = Files.newInputStream(input); OutputStream out = Base64.getUrlEncoder().wrap(Files.newOutputStream(output))) {
                final byte[] buffer = new byte[1024 * 8];
    
                for (int read = in.read(buffer); read > 0; read = in.read(buffer)) {
                    out.write(buffer, 0, read);
                }
            }
        }
    }
    

PS:如果你真的需要 URL 编码器,你必须创建它的流式版本,但我认为 URL 安全的 base64 就足够了

关于java - 如何修复 java.lang.OutOfMemoryError : Java heap space error?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55331820/

相关文章:

tomcat - 线程和JMS哪个更好?

java - 如果 JerseyClient (2.1.x) 响应没有正文,是否需要关闭它的连接?

java - 无法将 org.glassfish.jersey.inject.hk2.Hk2InjectionManagerFactory 转换为 org.glassfish.jersey.internal.inject.InjectionManagerFactory

java - 如何使用 Java 1.5 和 jersey 1.2 公开 RESTful Web 服务,.class 文件中的版本号错误

Java JScrollpane 不可见

java - 从 getter 方法获取数据而不是传入 Bundle

spring-boot - Spring Boot节俭

java - 在我们可以调用它之前,一个函数到底必须遵守什么规则 "idempotent"?

Java Graphics2D 移动物体停在中间

java - Spring Security 不会将 HTTP 重定向到 HTTPS