第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何修復(fù)java.lang.OutOfMemoryError:Java堆空間錯(cuò)誤?

如何修復(fù)java.lang.OutOfMemoryError:Java堆空間錯(cuò)誤?

桃花長(zhǎng)相依 2022-09-01 18:07:29
我有一個(gè)大小為32 MB的文件,我已將其從DocuShare服務(wù)器下載到DocuShare臨時(shí)文件夾。我正在嘗試從中讀取文件內(nèi)容以創(chuàng)建文件。我在對(duì) base64 內(nèi)容進(jìn)行 URL 編碼時(shí)遇到錯(cuò)誤。當(dāng)我運(yùn)行一個(gè)簡(jiǎn)單的java應(yīng)用程序時(shí),我沒有遇到任何異常。但是,當(dāng)我在DocuShare服務(wù)中使用相同的代碼來獲取文檔內(nèi)容時(shí),我會(huì)收到異常。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);如何修復(fù)此錯(cuò)誤?我需要增加我的雄貓堆大小嗎?
查看完整描述

3 回答

?
慕森王

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊

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

  1. 您可以增加堆大小,但 IMO 這是一個(gè)糟糕的解決方案,因?yàn)槿绻盏蕉鄠€(gè)并行請(qǐng)求或嘗試處理更大的文件,則會(huì)遇到相同的問題。

  2. 您可以優(yōu)化算法 - 而不是在內(nèi)存中存儲(chǔ)文件的多個(gè)副本,而是可以以流方式處理它,從而在內(nèi)存中保存不超過幾個(gè)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編碼器,則必須創(chuàng)建它的流媒體版本,但我認(rèn)為URL安全的base64就足夠了


查看完整回答
反對(duì) 回復(fù) 2022-09-01
?
臨摹微笑

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊

Base64 將每個(gè) 3 個(gè)字節(jié)轉(zhuǎn)換為 4 個(gè)字母。這意味著您可以以塊的形式讀取數(shù)據(jù),并以與解碼整個(gè)文件相同的方式對(duì)其進(jìn)行解碼。


試試這個(gè):


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


查看完整回答
反對(duì) 回復(fù) 2022-09-01
?
qq_遁去的一_1

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊

如果您有大文件,則根據(jù)文件大小,您將始終遇到OOM錯(cuò)誤。如果您的目標(biāo)是使用Apache Commons Base64 Streams進(jìn)行base64編碼。

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


查看完整回答
反對(duì) 回復(fù) 2022-09-01
  • 3 回答
  • 0 關(guān)注
  • 266 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)