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

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

捕獲java.lang.OutOfMemoryError?

捕獲java.lang.OutOfMemoryError?

SMILET 2019-07-01 10:03:30
捕獲java.lang.OutOfMemoryError?文獻資料為java.lang.Error說:錯誤是Throwable的子類,它指示合理的應用程序不應該試圖捕捉的嚴重問題。但是.java.lang.Error是java.lang.Throwable,我能抓住這種類型的“可扔”(Throwable)。我明白為什么抓住這種異常不是個好主意。據(jù)我所知,如果我們決定捕獲它,CATCH處理程序不應該單獨分配任何內(nèi)存。不然的話OutOfMemoryError將再次被拋出。所以,我的問題是:當捕捉到java.lang.OutOfMemoryError也許是個好主意?如果我們決定抓到java.lang.OutOfMemoryError,我們?nèi)绾未_保CATCH處理程序本身不分配任何內(nèi)存(任何工具或最佳實踐)?
查看完整描述

3 回答

?
阿晨1998

TA貢獻2037條經(jīng)驗 獲得超6個贊

我同意和不同意這里的大多數(shù)答復。

在許多情況下,您可能希望捕獲OutOfMemoryError根據(jù)我的經(jīng)驗(在Windows和Solaris JVM上),很少有OutOfMemoryError向JVM敲響喪鐘。

只有一個很好的理由OutOfMemoryError這就是優(yōu)雅地關閉,干凈地釋放資源,并盡可能地記錄失敗的原因(如果仍然可以這樣做的話)。

一般來說,OutOfMemoryError由于無法滿足堆的剩余資源的塊內(nèi)存分配而發(fā)生。

Error拋出堆包含與不成功分配之前相同數(shù)量的分配對象,現(xiàn)在是刪除對運行時對象的引用以釋放清理所需的更多內(nèi)存的時候了。在這些情況下,它甚至可能繼續(xù),但這肯定是一個壞主意,因為您永遠無法100%肯定JVM處于可修復狀態(tài)。

證明OutOfMemoryError并不意味著JVM在CATCH塊中內(nèi)存不足:

private static final int MEGABYTE = (1024*1024);public static void runOutOfMemory() {
    MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
    for (int i=1; i <= 100; i++) {
        try {
            byte[] bytes = new byte[MEGABYTE*500];
        } catch (Exception e) {
            e.printStackTrace();
        } catch (OutOfMemoryError e) {
            MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage();
            long maxMemory = heapUsage.getMax() / MEGABYTE;
            long usedMemory = heapUsage.getUsed() / MEGABYTE;
            System.out.println(i+ " : Memory Use :" + usedMemory + "M/" + maxMemory + "M");
        }
    }}

此代碼的輸出:

1 : Memory Use :0M/247M......98 : Memory Use :0M/247M99 : Memory Use :0M/247M100 : Memory Use :0M/247M

如果運行一些關鍵的東西,我通常會捕捉到Error,將其記錄到syserr,然后使用我選擇的日志框架進行日志記錄,然后繼續(xù)釋放資源并以干凈的方式關閉。最壞的情況是什么?JVM正在死亡(或者已經(jīng)死了),通過捕獲Error至少有清理的機會。

但要注意的是,只有在可能進行清理的地方才能捕獲這些類型的錯誤。不要毛毯catch(Throwable t) {}到處亂七八糟的。


查看完整回答
反對 回復 2019-07-01
?
UYOU

TA貢獻1878條經(jīng)驗 獲得超4個贊

你,你們能,會,可以從它中恢復過來:

package com.stackoverflow.q2679330;public class Test {

    public static void main(String... args) {
        int size = Integer.MAX_VALUE;
        int factor = 10;

        while (true) {
            try {
                System.out.println("Trying to allocate " + size + " bytes");
                byte[] bytes = new byte[size];
                System.out.println("Succeed!");
                break;
            } catch (OutOfMemoryError e) {
                System.out.println("OOME .. Trying again with 10x less");
                size /= factor;
            }
        }
    }}

但這有意義嗎?你還想做什么?你最初為什么要分配那么多內(nèi)存?內(nèi)存少也可以嗎?你為什么不好好利用它呢?或者如果這是不可能的,為什么不從一開始就給JVM更多的內(nèi)存呢?

回到你的問題:

1:捕捉java.lang.OutOfMemoryError可能是個好主意。

沒人會想到。

2:如果我們捕獲java.lang.OutOfMemoryError,如何確保CATCH處理程序本身不分配任何內(nèi)存(任何工具或最佳實踐)?

這取決于是什么導致了OOME。如果它被聲明在try一步的發(fā)生,那么你的機會就很小了。你,你們可以,可能想事先預留一些內(nèi)存空間:

private static byte[] reserve = new byte[1024 * 1024]; // Reserves 1MB.

然后在OOME期間將其設置為零:

} catch (OutOfMemoryException e) {
     reserve = new byte[0];
     // Ha! 1MB free!}

當然,這完全沒有意義;)只要根據(jù)應用程序的需要給JVM足夠的內(nèi)存即可。必要時運行分析器。


查看完整回答
反對 回復 2019-07-01
?
LEATH

TA貢獻1936條經(jīng)驗 獲得超7個贊

一般來說,嘗試從OOM中捕獲和恢復是一個壞主意。

  1. OOME也可以拋到其他線程上,包括應用程序甚至不知道的線程。任何這樣的線程現(xiàn)在都會死掉,任何等待通知的東西都可能永遠被卡住。簡而言之,你的應用程序可能會被徹底破壞。

  2. 即使您確實成功地恢復了,您的JVM可能仍然處于堆饑餓狀態(tài),因此您的應用程序將執(zhí)行得很糟糕。

使用OOME最好的方法是讓JVM死掉。

(這假設JVM是嗎?去死吧。例如,Tomcatservlet線程上的Ooms不會殺死JVM,這會導致Tomcat進入緊張狀態(tài),在那里它不會響應任何請求.甚至不請求重新啟動)。

編輯

我并不是說抓OOM是個壞主意。當您試圖從OOME中恢復時,無論是故意的還是由于疏忽,都會出現(xiàn)問題。無論何時捕獲OOM(直接,或作為錯誤或Throwable的子類型),您都應該重新拋出OOM,或者安排應用程序/JVM退出。

旁白:這意味著為了在面向對象的情況下獲得最大的健壯性,應用程序應該使用Thread.setDefaultUncoghtExceptionHandler()設置將導致應用程序在發(fā)生OOME時退出的處理程序,無論OOME拋出在哪個線程上。我會對此有興趣的.

唯一的另一種情況是當你知道當然了OOM沒有造成任何附帶損害;也就是說,你知道:

  • 是什么導致了OOME,
  • 應用程序當時正在做什么,簡單地放棄計算是可以的,并且
  • 一個(大致)同時的OOME不可能發(fā)生在另一個線程上。

有些應用程序有可能知道這些事情,但對于大多數(shù)應用程序,您無法確定在OOME之后繼續(xù)使用是安全的。即使當你嘗試它時,它在經(jīng)驗上是“有效的”。

(問題是,需要有正式證據(jù)證明“預期”O(jiān)OME的后果是安全的,而“意外”O(jiān)OME不能在嘗試/捕獲OOME的控制范圍內(nèi)發(fā)生。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號