摘要:現(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
摘要:回調(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)代(終端...
摘要:檢索新的事件執(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)核。 ...
摘要:如果一個(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的博客生涯了,先從基本的原理講起.以前寫...
摘要:函數(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 為...
摘要:無論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須有確定的值,以便把這些值傳送給形參。形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動銷毀了。函數(shù)的聲明一般出現(xiàn)在函數(shù)的使用之前。函數(shù)的聲明一般要放在頭文件中的。 索引: 一. 函數(shù)是什么 二. 庫函數(shù) 三. 自定義函數(shù) ?函數(shù)參數(shù) 四 函數(shù)的...
閱讀 2180·2021-09-22 10:56
閱讀 1485·2021-09-07 10:11
閱讀 1810·2019-08-30 15:54
閱讀 2297·2019-08-30 15:44
閱讀 2315·2019-08-29 12:40
閱讀 3037·2019-08-28 18:25
閱讀 1745·2019-08-26 10:24
閱讀 3193·2019-08-23 18:39