摘要:現象有一個方法邏輯如下分批查詢的數據每次條做一些處理后修改狀態表示已經處理過了遞歸調用直到查不出數據來發現當數據量大的時候如有幾萬條數據待處理很容易發生內存溢出的問題覺得很奇怪不是每次限制只查條嗎怎么還會有內存溢出的問題呢假設遞歸調用不會釋
現象
有一個方法 邏輯如下
分批查詢state=0的數據 每次500條
做一些處理后 修改state狀態 state=0 ==> state=1 表示已經處理過了
遞歸調用 直到查不出數據來
發現當數據量大的時候 如有幾萬條數據待處理 很容易發生內存溢出的問題 覺得很奇怪 不是每次限制只查500條嗎 怎么還會有內存溢出的問題呢?
假設
遞歸調用不會釋放局部變量 直到方法調用結束
證明
@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); }
當指定最大堆內存50M (-Xmx50M)的時候 遞歸調用到40次左右的時候 便會發生內存溢出異常
40 1048576 java.lang.OutOfMemoryError: Java heap space
可知遞歸調用并未釋放變量a的內存占用
解決
改成循環調用即可
@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 ++; } }
同樣設置-Xmx50M 此時可以無限執行下去
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71096.html
摘要:回調函數執行幾乎所有的回調函數,除了關閉回調函數,定時器計劃的回調函數和。輪詢此階段有兩個主要的功能執行已過時的定時器腳本處理輪詢隊列中的事件。一旦輪詢隊列為空,事件循環將檢查已達到時間閾值的定時器。 什么是事件循環(Event Loop)? 事件環使得Node.js可以執行非阻塞I/O 操作,只要有可能就將操作卸載到系統內核,盡管JavaScript是單線程的。 由于大多數現代(終端...
摘要:檢索新的事件執行與相關的回調幾乎所有,除了由定時器調度的一些和將在適當的時候在這里阻塞。在事件循環的每次運行之間,檢查它是否在等待任何異步或定時器,如果沒有,則徹底關閉。 Node.js事件循環、定時器和process.nextTick() 什么是事件循環? 事件循環允許Node.js執行非阻塞I/O操作 — 盡管JavaScript是單線程的 — 通過盡可能將操作卸載到系統內核。 ...
摘要:如果一個即時定時器是被一個正在執行的回調排入隊列的,則該定時器直到下一次事件循環迭代才會被觸發。參數描述在事件循環的當前回合結束時要調用的函數。事件輪詢隨后的調用,會在任何事件包括定時器之前運行。 系列文章 Nodejs高性能原理(上) --- 異步非阻塞事件驅動模型Nodejs高性能原理(下) --- 事件循環詳解 前言 終于開始我nodejs的博客生涯了,先從基本的原理講起.以前寫...
摘要:函數式編程的哲學就是假定副作用是造成不正當行為的主要原因。函數組合面向對象通常被比喻為名詞,而函數式編程是動詞。尾遞歸優化函數式編程語言中因為不可變數據結構的原因,沒辦法實現循環。 零、前言 說到函數式編程,想必各位或多或少都有所耳聞,然而對于函數式的內涵和本質可能又有些說不清楚。 所以本文希望針對工程師,從應用(而非學術)的角度將函數式編程相關思想和實踐(以 JavaScript 為...
閱讀 2158·2021-09-22 10:56
閱讀 1465·2021-09-07 10:11
閱讀 1800·2019-08-30 15:54
閱讀 2290·2019-08-30 15:44
閱讀 2306·2019-08-29 12:40
閱讀 3031·2019-08-28 18:25
閱讀 1735·2019-08-26 10:24
閱讀 3186·2019-08-23 18:39