⑴ 內存溢出什麼意思怎麼解決呢
就是內存不夠,存溢出雖然很棘手,但也有相應的解決辦法,可以按照從易到難,一步步的解決。 第一步,就是修改JVM啟動參數,直接增加內存。這一點看上去似乎很簡單,但很容易被忽略。JVM默認可以使用的內存為64M,Tomcat默認可以使用的內存為128MB,對於稍復雜一點的系統就會不夠用。在某項目中,就因為啟動參數使用的默認值,經常報「OutOfMemory」錯誤。因此,-Xms,-Xmx參數一定不要忘記加。 第二步,檢查錯誤日誌,查看「OutOfMemory」錯誤前是否有其它異常或錯誤。在一個項目中,使用兩個資料庫連接,其中專用於發送簡訊的資料庫連接使用DBCP連接池管理,用戶為不將簡訊發出,有意將資料庫連接用戶名改錯,使得日誌中有許多資料庫連接異常的日誌,一段時間後,就出現「OutOfMemory」錯誤。經分析,這是由於DBCP連接池BUG引起的,資料庫連接不上後,沒有將連接釋放,最終使得DBCP報「OutOfMemory」錯誤。經過修改正確資料庫連接參數後,就沒有再出現內存溢出的錯誤。 查看日誌對於分析內存溢出是非常重要的,通過仔細查看日誌,分析內存溢出前做過哪些操作,可以大致定位有問題的模塊。 第三步,安排有經驗的編程人員對代碼進行走查和分析,找出可能發生內存溢出的位置。重點排查以下幾點: �8�5 檢查代碼中是否有死循環或遞歸調用。 �8�5 檢查是否有大循環重復產生新對象實體。 �8�5 檢查對資料庫查詢中,是否有一次獲得全部數據的查詢。一般來說,如果一次取十萬條記錄到內存,就可能引起內存溢出。這個問題比較隱蔽,在上線前,資料庫中數據較少,不容易出問題,上線後,資料庫中數據多了,一次查詢就有可能引起內存溢出。因此對於資料庫查詢盡量採用分頁的方式查詢。 �8�5 檢查List、MAP等集合對象是否有使用完後,未清除的問題。List、MAP等集合對象會始終存有對對象的引用,使得這些對象不能被GC回收。 第四步,使用內存查看工具動態查看內存使用情況。某個項目上線後,每次系統啟動兩天後,就會出現內存溢出的錯誤。這種情況一般是代碼中出現了緩慢的內存泄漏,用上面三個步驟解決不了,這就需要使用內存查看工具了。 內存查看工具有許多,比較有名的有:Optimizeit Profiler、JProbeProfiler、JinSight和Java1.5的Jconsole等。它們的基本工作原理大同小異,都是監測Java程序運行時所有對象的申請、釋放等動作,將內存管理的所有信息進行統計、分析、可視化。開發人員可以根據這些信息判斷程序是否有內存泄漏問題。一般來說,一個正常的系統在其啟動完成後其內存的佔用量是基本穩定的,而不應該是無限制的增長的。持續地觀察系統運行時使用的內存的大小,可以看到在內存使用監控窗口中是基本規則的鋸齒形的圖線,如果內存的大小持續地增長,則說明系統存在內存泄漏問題。通過間隔一段時間取一次內存快照,然後對內存快照中對象的使用與引用等信息進行比對與分析,可以找出是哪個類的對象在泄漏。 通過以上四個步驟的分析與處理,基本能處理內存溢出的問題。當然,在這些過程中也需要相當的經驗與敏感度,需要在實際的開發與調試過程中不斷積累。
⑵ PHP 斷點上傳超大文件,合並文件時內存溢出,怎麼處理
後台腳本佔用的內存是有個上限的,不是你想用多少就有多少的。
你把文件數據用追加的方式寫入文件,而不是把所有數據拼接為字元串再一次性寫入文件,就不會造成內存溢出了:
file_put_contents('文件路徑', '要寫入的數據', FILE_APPEND);
⑶ 「數據溢出」是什麼意思
數據溢出
在計算機中,當要表示的數據超出計算機所使用的數據的表示範圍時,則產生數據的溢出。
溢出原因
數據類型超過了計算機字長的界限就會出現數據溢出的情況。導致內存溢出問題的原因有很多,比如:
(1) 使用非類型安全(non-type-safe)的語言如 C/C++ 等。
(2) 以不可靠的方式存取或者復制內存緩沖區。
(3)編譯器設置的內存緩沖區太靠近關鍵數據結構。
因素分析
1.內存溢出問題是 C 語言或者 C++ 語言所固有的缺陷,它們既不檢查數組邊界,又不檢查類型可靠性(type-safety)。眾所周知,用 C/C++ 語言開發的程序由於目標代碼非常接近機器內核,因而能夠直接訪問內存和寄存器,這種特性大大提升了 C/C++ 語言代碼的性能。只要合理編碼,C/C++應用程序在執行效率上必然優於其它高級語言。然而,C/C++ 語言導致內存溢出問題的可能性也要大許多。其他語言也存在內存溢出問題,但它往往不是程序員的失誤,而是應用程序的運行時環境出錯所致。
2. 當應用程序讀取用戶(也可能是惡意攻擊者)數據,試圖復制到應用程序開辟的內存緩沖區中,卻無法保證緩沖區的空間足夠時(換言之,假設代碼申請了 N 位元組大小的內存緩沖區,隨後又向其中復制超過 N 位元組的數據)。內存緩沖區就可能會溢出。想一想,如果你向 12 盎司的玻璃杯中倒入 16 盎司水,那麼多出來的 4 盎司水怎麼辦?當然會滿到玻璃杯外面了!
3. 最重要的是,C/C++編譯器開辟的內存緩沖區常常鄰近重要的數據結構。假設某個函數的堆棧緊接在在內存緩沖區後面時,其中保存的函數返回地址就會與內存緩沖區相鄰。此時,惡意攻擊者就可以向內存緩沖區復制大量數據,從而使得內存緩沖區溢出並覆蓋原先保存於堆棧中的函數返回地址。這樣,函數的返回地址就被攻擊者換成了他指定的數值;一旦函數調用完畢,就會繼續執行「函數返回地址」處的代碼。非但如此,C++ 的某些其它數據結構,比如 v-table 、例外事件處理程序、函數指針等,也可能受到類似的攻擊。
⑷ 內存溢出錯誤怎麼解決
引起內存溢出的原因有很多種,常見的有以下幾種:
1.內存中載入的數據量過於龐大,如一次從資料庫取出過多數據;
2.集合類中有對對象的引用,使用完後未清空,使得JVM不能回收;
3.代碼中存在死循環或循環產生過多重復的對象實體;
4.使用的第三方軟體中的BUG;
5.啟動參數內存值設定的過小
內存溢出的解決方案:
第一步,修改JVM啟動參數,直接增加內存。(-Xms,-Xmx參數一定不要忘記加。)
第二步,檢查錯誤日誌,查看「OutOfMemory」錯誤前是否有其它異常或錯誤。
第三步,對代碼進行走查和分析,找出可能發生內存溢出的位置。
重點排查以下幾點:
1.檢查對資料庫查詢中,是否有一次獲得全部數據的查詢。一般來說,如果一次取十萬條記錄到內存,就可能引起內存溢出。這個問題比較隱蔽,在上線前,資料庫中數據較少,不容易出問題,上線後,資料庫中數據多了,一次查詢就有可能引起內存溢出。因此對於資料庫查詢盡量採用分頁的方式查詢。
2.檢查代碼中是否有死循環或遞歸調用。
3.檢查是否有大循環重復產生新對象實體。
4.檢查對資料庫查詢中,是否有一次獲得全部數據的查詢。一般來說,如果一次取十萬條記錄到內存,就可能引起內存溢出。這個問題比較隱蔽,在上線前,資料庫中數據較少,不容易出問題,上線後,資料庫中數據多了,一次查詢就有可能引起內存溢出。因此對於資料庫查詢盡量採用分頁的方式查詢。
5.檢查List、MAP等集合對象是否有使用完後,未清除的問題。List、MAP等集合對象會始終存有對對象的引用,使得這些對象不能被GC回收。
第四步,使用內存查看工具動態查看內存使用情況
⑸ 內存溢出是什麼意思如何解決
內存溢出可能是病毒作怪,也有可能是程序錯誤. 。
內存溢出是指系統內存全部被佔用,沒有可用內存分配給新啟動的任務的情況,通常不會導致系統崩潰。
解決:
1、擴展內存條,或者增大虛擬內存的大小。
2、定期使用電腦安全軟體進行系統殺毒。
3、定期使用電腦安全軟體進行垃圾清理。
(5)用戶上傳數據內存溢出擴展閱讀:
防止於緩沖區內存溢出:
1、開放程序時仔細檢查溢出情況,不允許數據溢出緩沖區。由於編程和編程語言的原因,這非常困難,而且不適合大量已經在使用的程序;
2、使用檢查堆棧溢出的編譯器或者在程序中加入某些記號,以便程序運行時確認禁止黑客有意造成的溢出。問題是無法針對已有程序,對新程序來講,需要修改編譯器;
⑹ android http協議上傳數據內存溢出怎麼處理
一般是分塊上傳,不能一次用太大內存,用固定內存大小,一直申請肯定會內存溢出。
⑺ 內存溢出的解決方法
內存溢出雖然很棘手,但也有相應的解決辦法,可以按照從易到難,一步步的解決。
第一步,就是修改JVM啟動參數,直接增加內存。這一點看上去似乎很簡單,但很容易被忽略。JVM默認可以使用的內存為64M,Tomcat默認可以使用的內存為128MB,對於稍復雜一點的系統就會不夠用。在某項目中,就因為啟動參數使用的默認值,經常報「OutOfMemory」錯誤。因此,-Xms,-Xmx參數一定不要忘記加。
第二步,檢查錯誤日誌,查看「OutOfMemory」錯誤前是否有其它異常或錯誤。在一個項目中,使用兩個資料庫連接,其中專用於發送簡訊的資料庫連接使用DBCP連接池管理,用戶為不將簡訊發出,有意將資料庫連接用戶名改錯,使得日誌中有許多資料庫連接異常的日誌,一段時間後,就出現「OutOfMemory」錯誤。經分析,這是由於DBCP連接池BUG引起的,資料庫連接不上後,沒有將連接釋放,最終使得DBCP報「OutOfMemory」錯誤。經過修改正確資料庫連接參數後,就沒有再出現內存溢出的錯誤。
查看日誌對於分析內存溢出是非常重要的,通過仔細查看日誌,分析內存溢出前做過哪些操作,可以大致定位有問題的模塊。
第三步,安排有經驗的編程人員對代碼進行走查和分析,找出可能發生內存溢出的位置。重點排查以下幾點:
檢查代碼中是否有死循環或遞歸調用。
檢查是否有大循環重復產生新對象實體。
檢查對資料庫查詢中,是否有一次獲得全部數據的查詢。一般來說,如果一次取十萬條記錄到內存,就可能引起內存溢出。這個問題比較隱蔽,在上線前,資料庫中數據較少,不容易出問題,上線後,資料庫中數據多了,一次查詢就有可能引起內存溢出。因此對於資料庫查詢盡量採用分頁的方式查詢。
檢查List、MAP等集合對象是否有使用完後,未清除的問題。List、MAP等集合對象會始終存有對對象的引用,使得這些對象不能被GC回收。
第四步,使用內存查看工具動態查看內存使用情況。某個項目上線後,每次系統啟動兩天後,就會出現內存溢出的錯誤。這種情況一般是代碼中出現了緩慢的內存泄漏,用上面三個步驟解決不了,這就需要使用內存查看工具了。
內存查看工具有許多,比較有名的有:Optimizeit Profiler、JProbeProfiler、JinSight和Java1.5的Jconsole等。它們的基本工作原理大同小異,都是監測Java程序運行時所有對象的申請、釋放等動作,將內存管理的所有信息進行統計、分析、可視化。開發人員可以根據這些信息判斷程序是否有內存泄漏問題。一般來說,一個正常的系統在其啟動完成後其內存的佔用量是基本穩定的,而不應該是無限制的增長的。持續地觀察系統運行時使用的內存的大小,可以看到在內存使用監控窗口中是基本規則的鋸齒形的圖線,如果內存的大小持續地增長,則說明系統存在內存泄漏問題。通過間隔一段時間取一次內存快照,然後對內存快照中對象的使用與引用等信息進行比對與分析,可以找出是哪個類的對象在泄漏。
通過以上四個步驟的分析與處理,基本能處理內存溢出的問題。當然,在這些過程中也需要相當的經驗與敏感度,需要在實際的開發與調試過程中不斷積累。
⑻ 內存溢出和內存泄漏分別是什麼意思
內存溢出 out of memory,是指程序在申請內存時,沒有足夠的內存空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是內存溢出。
內存泄露 memory leak,是指程序在申請內存後,無法釋放已申請的內存空間,一次內存泄露危害可以忽略,但內存泄露堆積後果很嚴重,無論多少內存,遲早會被佔光。
memory leak會最終會導致out of memory!
內存溢出就是你要求分配的內存超出了系統能給你的,系統不能滿足需求,於是產生溢出。
內存泄漏是指你向系統申請分配內存進行使用(new),可是使用完了以後卻不歸還(delete),結果你申請到的那塊內存你自己也不能再訪問(也許你把它的地址給弄丟了),而系統也不能再次將它分配給需要的程序。一個盤子用盡各種方法只能裝4個果子,你裝了5個,結果掉倒地上不能吃了。這就是溢出!比方說棧,棧滿時再做進棧必定產生空間溢出,叫上溢,棧空時再做退棧也產生空間溢出,稱為下溢。就是分配的內存不足以放下數據項序列,稱為內存溢出.
以發生的方式來分類,內存泄漏可以分為4類:
1. 常發性內存泄漏。發生內存泄漏的代碼會被多次執行到,每次被執行的時候都會導致一塊內存泄漏。
2. 偶發性內存泄漏。發生內存泄漏的代碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測內存泄漏至關重要。
3. 一次性內存泄漏。發生內存泄漏的代碼只會被執行一次,或者由於演算法上的缺陷,導致總會有一塊僅且一塊內存發生泄漏。比如,在類的構造函數中分配內存,在析構函數中卻沒有釋放該內存,所以內存泄漏只會發生一次。
4. 隱式內存泄漏。程序在運行過程中不停的分配內存,但是直到結束的時候才釋放內存。嚴格的說這里並沒有發生內存泄漏,因為最終程序釋放了所有申請的內存。但是對於一個伺服器程序,需要運行幾天,幾周甚至幾個月,不及時釋放內存也可能導致最終耗盡系統的所有內存。所以,我們稱這類內存泄漏為隱式內存泄漏。
從用戶使用程序的角度來看,內存泄漏本身不會產生什麼危害,作為一般的用戶,根本感覺不到內存泄漏的存在。真正有危害的是內存泄漏的堆積,這會最終消耗盡系統所有的內存。從這個角度來說,一次性內存泄漏並沒有什麼危害,因為它不會堆積,而隱式內存泄漏危害性則非常大,因為較之於常發性和偶發性內存泄漏它更難被檢測到
內存溢出的原因以及解決方法
引起內存溢出的原因有很多種,小編列舉一下常見的有以下幾種:
1.內存中載入的數據量過於龐大,如一次從資料庫取出過多數據;
2.集合類中有對對象的引用,使用完後未清空,使得JVM不能回收;
3.代碼中存在死循環或循環產生過多重復的對象實體;
4.使用的第三方軟體中的BUG;
5.啟動參數內存值設定的過小
內存溢出的解決方案:
第一步,修改JVM啟動參數,直接增加內存。(-Xms,-Xmx參數一定不要忘記加。)
第二步,檢查錯誤日誌,查看逗OutOfMemory地錯誤前是否有其它異常或錯誤。
第三步,對代碼進行走查和分析,找出可能發生內存溢出的位置。
重點排查以下幾點:
1.檢查對資料庫查詢中,是否有一次獲得全部數據的查詢。一般來說,如果一次取十萬條記錄到內存,就可能引起內存溢出。這個問題比較隱蔽,在上線前,資料庫中數據較少,不容易出問題,上線後,資料庫中數據多了,一次查詢就有可能引起內存溢出。因此對於資料庫查詢盡量採用分頁的方式查詢。
2.檢查代碼中是否有死循環或遞歸調用。
3.檢查是否有大循環重復產生新對象實體。
4.檢查對資料庫查詢中,是否有一次獲得全部數據的查詢。一般來說,如果一次取十萬條記錄到內存,就可能引起內存溢出。這個問題比較隱蔽,在上線前,資料庫中數據較少,不容易出問題,上線後,資料庫中數據多了,一次查詢就有可能引起內存溢出。因此對於資料庫查詢盡量採用分頁的方式查詢。
5.檢查List、MAP等集合對象是否有使用完後,未清除的問題。List、MAP等集合對象會始終存有對對象的引用,使得這些對象不能被GC回收。
第四步,使用內存查看工具動態查看內存使用情況
⑼ 在java中上傳文件出現內存溢出怎麼解決
具體問題具體處理。
你最起碼應該說明是哪種資料庫
是用JDBC還是ODBC還是hibernate。
一般這種情況都是分批插入。
每個會話插入50條,然後關閉,再重新做一次連接。
然後再插。
或者中間多做幾次commit
access的資料庫在使用某個版本的驅動時,如果是免費版的,
一次就只能插入50條數據。