国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

遞歸調(diào)用 VS 循環(huán)調(diào)用

Awbeci / 1642人閱讀

摘要:現(xiàn)象有一個(gè)方法邏輯如下分批查詢的數(shù)據(jù)每次條做一些處理后修改狀態(tài)表示已經(jīng)處理過了遞歸調(diào)用直到查不出數(shù)據(jù)來發(fā)現(xiàn)當(dāng)數(shù)據(jù)量大的時(shí)候如有幾萬條數(shù)據(jù)待處理很容易發(fā)生內(nèi)存溢出的問題覺得很奇怪不是每次限制只查條嗎怎么還會有內(nèi)存溢出的問題呢假設(shè)遞歸調(diào)用不會釋

現(xiàn)象

有一個(gè)方法 邏輯如下

分批查詢state=0的數(shù)據(jù) 每次500條

做一些處理后 修改state狀態(tài) state=0 ==> state=1 表示已經(jīng)處理過了

遞歸調(diào)用 直到查不出數(shù)據(jù)來

發(fā)現(xiàn)當(dāng)數(shù)據(jù)量大的時(shí)候 如有幾萬條數(shù)據(jù)待處理 很容易發(fā)生內(nèi)存溢出的問題 覺得很奇怪 不是每次限制只查500條嗎 怎么還會有內(nèi)存溢出的問題呢?

假設(shè)
遞歸調(diào)用不會釋放局部變量 直到方法調(diào)用結(jié)束

證明

@Test
public void recursiveCall(){
    foo(1);
}

private void foo(int i){
    // 局部變量 占用1M
    byte[] a = new byte[1 * 1024 * 1024];
    System.out.println(i+" "+a.length);
    foo(i+1);
}

當(dāng)指定最大堆內(nèi)存50M (-Xmx50M)的時(shí)候 遞歸調(diào)用到40次左右的時(shí)候 便會發(fā)生內(nèi)存溢出異常

40 1048576
java.lang.OutOfMemoryError: Java heap space

可知遞歸調(diào)用并未釋放變量a的內(nèi)存占用

解決
改成循環(huán)調(diào)用即可

@Test
public void loopCall(){
    bar();
}

private void bar(){
    int index = 1;
    while (true) {
        byte[] a = new byte[1 * 1024 * 1024];
        System.out.println(index+" "+a.length);
        index ++;
    }
}

同樣設(shè)置-Xmx50M 此時(shí)可以無限執(zhí)行下去

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71096.html

相關(guān)文章

  • Node.js中的事件循環(huán)(Event Loop),計(jì)時(shí)器(Timers)以及process.nex

    摘要:回調(diào)函數(shù)執(zhí)行幾乎所有的回調(diào)函數(shù),除了關(guān)閉回調(diào)函數(shù),定時(shí)器計(jì)劃的回調(diào)函數(shù)和。輪詢此階段有兩個(gè)主要的功能執(zhí)行已過時(shí)的定時(shí)器腳本處理輪詢隊(duì)列中的事件。一旦輪詢隊(duì)列為空,事件循環(huán)將檢查已達(dá)到時(shí)間閾值的定時(shí)器。 什么是事件循環(huán)(Event Loop)? 事件環(huán)使得Node.js可以執(zhí)行非阻塞I/O 操作,只要有可能就將操作卸載到系統(tǒng)內(nèi)核,盡管JavaScript是單線程的。 由于大多數(shù)現(xiàn)代(終端...

    KoreyLee 評論0 收藏0
  • Node.js 指南(Node.js事件循環(huán)、定時(shí)器和process.nextTick())

    摘要:檢索新的事件執(zhí)行與相關(guān)的回調(diào)幾乎所有,除了由定時(shí)器調(diào)度的一些和將在適當(dāng)?shù)臅r(shí)候在這里阻塞。在事件循環(huán)的每次運(yùn)行之間,檢查它是否在等待任何異步或定時(shí)器,如果沒有,則徹底關(guān)閉。 Node.js事件循環(huán)、定時(shí)器和process.nextTick() 什么是事件循環(huán)? 事件循環(huán)允許Node.js執(zhí)行非阻塞I/O操作 — 盡管JavaScript是單線程的 — 通過盡可能將操作卸載到系統(tǒng)內(nèi)核。 ...

    pingink 評論0 收藏0
  • Nodejs高性能原理(下) --- 事件循環(huán)詳解

    摘要:如果一個(gè)即時(shí)定時(shí)器是被一個(gè)正在執(zhí)行的回調(diào)排入隊(duì)列的,則該定時(shí)器直到下一次事件循環(huán)迭代才會被觸發(fā)。參數(shù)描述在事件循環(huán)的當(dāng)前回合結(jié)束時(shí)要調(diào)用的函數(shù)。事件輪詢隨后的調(diào)用,會在任何事件包括定時(shí)器之前運(yùn)行。 系列文章 Nodejs高性能原理(上) --- 異步非阻塞事件驅(qū)動模型Nodejs高性能原理(下) --- 事件循環(huán)詳解 前言 終于開始我nodejs的博客生涯了,先從基本的原理講起.以前寫...

    newsning 評論0 收藏0
  • JavaScript 函數(shù)式編程(一)

    摘要:函數(shù)式編程的哲學(xué)就是假定副作用是造成不正當(dāng)行為的主要原因。函數(shù)組合面向?qū)ο笸ǔ1槐扔鳛槊~,而函數(shù)式編程是動詞。尾遞歸優(yōu)化函數(shù)式編程語言中因?yàn)椴豢勺償?shù)據(jù)結(jié)構(gòu)的原因,沒辦法實(shí)現(xiàn)循環(huán)。 零、前言 說到函數(shù)式編程,想必各位或多或少都有所耳聞,然而對于函數(shù)式的內(nèi)涵和本質(zhì)可能又有些說不清楚。 所以本文希望針對工程師,從應(yīng)用(而非學(xué)術(shù))的角度將函數(shù)式編程相關(guān)思想和實(shí)踐(以 JavaScript 為...

    hoohack 評論0 收藏0
  • 最強(qiáng)函數(shù)學(xué)習(xí)之路

    摘要:無論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須有確定的值,以便把這些值傳送給形參。形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動銷毀了。函數(shù)的聲明一般出現(xiàn)在函數(shù)的使用之前。函數(shù)的聲明一般要放在頭文件中的。 索引: 一. 函數(shù)是什么 二. 庫函數(shù) 三. 自定義函數(shù) ?函數(shù)參數(shù) 四 函數(shù)的...

    _Dreams 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<