亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何修復java.lang.OutOfMemoryError:Java堆空間錯誤?

如何修復java.lang.OutOfMemoryError:Java堆空間錯誤?

桃花長相依 2022-09-01 18:07:29
我有一個大小為32 MB的文件,我已將其從DocuShare服務器下載到DocuShare臨時文件夾。我正在嘗試從中讀取文件內容以創建文件。我在對 base64 內容進行 URL 編碼時遇到錯誤。當我運行一個簡單的java應用程序時,我沒有遇到任何異常。但是,當我在DocuShare服務中使用相同的代碼來獲取文檔內容時,我會收到異常。HTTP Status 500 - org.glassfish.jersey.server.ContainerException: java.lang.OutOfMemoryError: Java heap spaceorg.glassfish.jersey.server.ContainerException: java.lang.OutOfMemoryError: Java heap spaceFile 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);如何修復此錯誤?我需要增加我的雄貓堆大小嗎?
查看完整描述

3 回答

?
慕森王

TA貢獻1777條經驗 獲得超3個贊

有兩種方法可以解決此問題。

  1. 您可以增加堆大小,但 IMO 這是一個糟糕的解決方案,因為如果您收到多個并行請求或嘗試處理更大的文件,則會遇到相同的問題。

  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就足夠了


查看完整回答
反對 回復 2022-09-01
?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

Base64 將每個 3 個字節轉換為 4 個字母。這意味著您可以以塊的形式讀取數據,并以與解碼整個文件相同的方式對其進行解碼。


試試這個:


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


查看完整回答
反對 回復 2022-09-01
?
qq_遁去的一_1

TA貢獻1725條經驗 獲得超8個贊

如果您有大文件,則根據文件大小,您將始終遇到OOM錯誤。如果您的目標是使用Apache Commons Base64 Streams進行base64編碼。

https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64InputStream.html


查看完整回答
反對 回復 2022-09-01
  • 3 回答
  • 0 關注
  • 272 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號