1. 程式人生 > >java 記憶體溢位 棧溢位的原因與排查方法

java 記憶體溢位 棧溢位的原因與排查方法

1、 記憶體溢位的原因是什麼?

記憶體溢位是由於沒被引用的物件(垃圾)過多造成JVM沒有及時回收,造成的記憶體溢位。如果出現這種現象可行程式碼排查:

一)是否App中的類中和引用變數過多使用了Static修飾 如public staitc Student s;在類中的屬性中使用 static修飾的最好只用基本型別或字串。如public static int i = 0; //public static String str;

二)是否App中使用了大量的遞迴或無限遞迴(遞迴中用到了大量的建新的物件)

三)是否App中使用了大量迴圈或死迴圈(迴圈中用到了大量的新建的物件)

四)檢查App中是否使用了向資料庫查詢所有記錄的方法。即一次性全部查詢的方法,如果資料量超過10萬多條了,就可能會造成記憶體溢位。所以在查詢時應採用“分頁查詢”。

五)檢查是否有陣列,List,Map中存放的是物件的引用而不是物件,因為這些引用會讓對應的物件不能被釋放。會大量儲存在記憶體中。

六)檢查是否使用了“非字面量字串進行+”的操作。因為String類的內容是不可變的,每次執行"+"就會產生新的物件,如果過多會造成新String物件過多,從而導致JVM沒有及時回收而出現記憶體溢位。

如String s1 = "My name";

String s2 = "is";

String s3 = "xuwei";

String str = s1 + s2 + s3 +.........;這是會容易造成記憶體溢位的

但是String str =  "My name" + " is " + " xuwei" + " nice " + " to " + " meet you"; //但是這種就不會造成記憶體溢位。因為這是”字面量字串“,在執行"+"時就會在編譯期間執行好。不會按照JVM來執行的。

在使用String,StringBuffer,StringBuilder時,如果是字面量字串進行"+"時,應選用String效能更好;如果是String類進行"+"時,在不考慮執行緒安全時,應選用StringBuilder效能更好。

  1. publicclass Test {  
  2.     publicvoid testHeap(){  
  3.         for(;;){  //死迴圈一直建立物件,堆溢位
  4.               ArrayList list = new ArrayList (2000);  
  5.           }  
  6.     }  
  7.     int num=1;  
  8.     publicvoid testStack(){  //無出口的遞迴呼叫,棧溢位
  9.         num++;  
  10.         this.testStack();  
  11.      }  
  12.     publicstaticvoid main(String[] args){  
  13.         Test  t  = new Test ();  
  14.         t.testHeap();  
  15.         t.testStack();     
  16.     }  


七)使用 DDMS工具進行查詢記憶體溢位的大概位置

2、棧溢位的原因

一)、是否有遞迴呼叫

二)、是否有大量迴圈或死迴圈

三)、全域性變數是否過多

四)、 陣列、List、map資料是否過大

五)使用DDMS工具進行查詢大概出現棧溢位的位置

ITeye推薦

相關 [java 記憶體 溢位] 推薦:

- - 網際網路 - ITeye部落格

1、 記憶體溢位的原因是什麼.       記憶體溢位是由於沒被引用的物件(垃圾)過多造成JVM沒有及時回收,造成的記憶體溢位. 如果出現這種現象可行程式碼排查:.     一)是否App中的類中和引用變數過多使用了Static修飾 如public staitc Student s;在類中的屬性中使用 static修飾的最好只用基本型別或字串. 如public static int i = 0; //public static String str;.   二)是否App中使用了大量的遞迴或無限遞迴(遞迴中用到了大量的建新的物件).   三)是否App中使用了大量迴圈或死迴圈(迴圈中用到了大量的新建的物件).

- - Java - 程式語言 - ITeye部落格

相信通過寫java程式討生活的人對記憶體溢位並不陌生,如下文字的出現更是讓人惱火:. 尤其當應用伺服器(Java容器)出現上述情況更是讓人有一種天塌下來的感覺.    好的編碼實踐可能會大大降低記憶體溢位的產生.    本文並不是寫如何規避記憶體溢位,但是我還是要介紹一下如何能夠儘量規避記憶體溢位:. 找幾個資深程式猿(或者整個專案組討論後)寫一個Java編碼規範,讓專案組成員儘量遵守. 一目瞭然的程式碼更容易定位問題,當然也更能讓人寫出好的程式碼. 單元測試要覆蓋所有分支與邊界條件. 有句老話說常在河邊站哪有不溼鞋(學名墨菲定律). 程式碼寫完了,找資深程式猿掃掃程式碼沒有壞處. 有條件的專案組要充分利用測試人員的能動性.

- - 研發管理 - ITeye部落格

垃圾回收是Java程式設計師瞭解最少的一部分. 他們認為Java虛擬機器接管了垃圾回收,因此沒必要去擔心記憶體的申請,分配等問題. 但是隨著應用越來越複雜,垃圾回收也越來越複雜,一旦垃圾回收變的複雜,應用的效能將會大打折扣. 所以,Java程式設計師瞭解垃圾回收的機制並且知道怎樣解決“記憶體溢位”問題會有很大的益處. 在Java中,有兩個非常普遍的記憶體溢位問題. 一個是堆記憶體溢位,另一個是持久代記憶體溢位.        Java物件是java 類的例項. 每當建立一個Java物件時,Java虛擬機器都會建立該物件的內部引用並且儲存在堆中. 如果一個類是第一次訪問,那麼它必須通過Java虛擬機器載入進來.


相關推薦

java記憶體溢位 溢位原因排查方法

 1、 記憶體溢位的原因是什麼?  記憶體溢位是由於沒被引用的物件(垃圾)過多造成JVM沒有及時回收,造成的記憶體溢位。如果出現這種現象可行程式碼排查: 一)是否App中的類中和引用變數過多使用了Static修飾 如public staitc Student s;在類中的屬性中使用 static修飾的

java 記憶體溢位 溢位原因排查方法

1、 記憶體溢位的原因是什麼? 記憶體溢位是由於沒被引用的物件(垃圾)過多造成JVM沒有及時回收,造成的記憶體溢位。如果出現這種現象可行程式碼排查: 一)是否App中的類中和引用變數過多使用了Static修飾 如public staitc Student s;在類中的屬性

Java記憶體溢位OutOfMemoryError的產生排查

在java的虛擬機器異常中,有兩個異常是大家比較關心的,一個是**StackOverflowError**,另一個是**OutOfMemoryError**。今天我們就來看看**OutOfMemoryError**是怎麼產生的,以及如何去排查這個異常。 ## 概念 要了解什麼是OutOfMemoryErr

【夾娃系列】java面試基礎知識儲備(¥2)——JVM記憶體劃分和記憶體溢位異常的原因和解決方法

JVM記憶體劃分和記憶體溢位 JVM記憶體劃分 記憶體溢位的異常和解決辦法 JVM記憶體劃分 堆:存放物件例項,被所有的執行緒共享的一塊區域。垃圾收集器管理的主要區域。 方法區:儲存虛擬機器載入的類資訊,常量,靜態變

Java程式碼分別使堆溢位,溢位

原文連結:https://www.cnblogs.com/tv151579/p/3647238.html 轉自:http://fxlzs2000.iteye.com/blog/1786407 轉自:http://my.oschina.net/sdrkyj/blog/143410 前言 primitiv

jvm 記憶體溢位的多種原因及優化方法

讓我們看一下我們日常在開發過程中接觸記憶體溢位的異常:   Exception in thread "main" [Full GCjava.lang.OutOfMemoryError: Java heap space at java.util.Ar

記憶體溢位的多種原因及優化方法

對於JVM的記憶體寫過的文章已經有點多了,而且有點爛了,不過說那麼多大多數在解決OOM的情況,於此,本文就只闡述這個內容,攜帶一些分析和理解和部分擴充套件內容,也就是JVM宕機中的一些問題,OK,下面說下OOM的常見情況: 第一類記憶體溢位,也是大家認為最多

java.sql.SQLException: Field 'id' doesn't have a default value(用eclipse操作數據庫時報了這種奇怪的錯誤)的原因解決方法

sql microsoft java except body class 操作數 解決方法 family 1、錯誤原因 由於id在數據庫表中是作為主鍵,但是在插入的過程中,沒有給予數值,並且沒有讓其自增 2、解決辦法 修改數據庫表中的id,讓

Java記憶體垃圾回收(Garbage Collection)機制基本方法和原則:System.gc()finalize()

Java記憶體垃圾回收(Garbage Collection)機制基本方法和原則:System.gc()與finalize() Java一個物件的finalize()函式,是在當前物件被回收時才會呼叫。System.gc()暗示和提醒JVM開始垃圾回收。Java程式中顯示呼叫System.g

android 程式執行出現 java.lang.NoClassDefFoundError的原因解決方法之一

原來專案沒問題,匯入後卻啟動不起來,檢視log發現有如下問題: 08-01 11:09:39.791: E/AndroidRuntime(13678): FATAL EXCEPTION: main 08-01 11:09:39.791: E/AndroidRuntime(

spring定時任務執行兩次的原因解決方法

ref net 任務 article 服務 每次 bsp tail 本地 spring定時任務,本地執行一次,放到服務器上後,每次執行時會執行兩次,原因及解決辦法。 http://blog.csdn.net/yaobengen/article/details/70312

201671010145 2016-2017《Java程序設計》靜態域靜態方法

arr 即使 定義 參數 pow 存在 設定 pub math 1.靜態域 如果將域定義為static,那麽每個類中只有一個這樣的域。而每一個對象對於所有的實例域卻都有自己的一份拷貝。例如,假定需要給每一個雇員賦予唯一的表示碼。這裏給Employee類添加一個實例域id

Java基礎09 類數據方法

綜合 基本 基礎 gis value stat col 聲明 private 作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝! 我們一直是為了產生對象而定義類(class)的。對象是具有功能的實體

onchange監聽input值變化及input隱藏後change事件不觸發的原因解決方法(設定readonly後onchange不起作用的解決方案)

轉自:https://www.cnblogs.com/white0710/p/7338456.html 1. onchange事件監聽input值變化的使用方法: <input id="test"></input> $("input"

onchange監聽input值變化及input隱藏後change事件不觸發的原因解決方法(設置readonly後onchange不起作用的解決方案)

com sdn 使用方法 pan val 內容 tar span .html 轉自:https://www.cnblogs.com/white0710/p/7338456.html 1. onchange事件監聽input值變化的使用方法: <input id=

mysql5.5-中文亂碼原因解決方法

一、出現中文亂碼的原因 1.檢視字符集 mysql> show variables like ‘%char%’; ±-------------------------±-----------------------------------------

mysql 報Row size too large 65535 原因解決方法

在MySQL建表時,遇到一個奇怪的現象: [email protected] : test 10:30:54>CREATE TABLE tb_test ( -> recordid varchar(32) NOT NULL, ->

【Linux】no space left on device 磁碟空間不足原因排查方法

在系統使用中,經常會遇到no space left on device 磁碟空間不足的情況, 下面來詳細的介紹一下產生這種情況的幾種原因及解決辦法: 1. 首先我們要清楚inode 和 block的概念: inode在格式化建立檔案系統的時候誕生,用來存放檔案的屬性資訊,

Httpservlet cannot be resolved to a type的原因解決方法~

Httpservlet cannot be resolved to a type,顯然是Eclipse找不到相應的包,即javax.servlet。 分析原因:JDK裡不包括servlet-api.jar 這個包,此包在Tomcat 中存在 ,如下圖所示: 在自己電腦

java複習(6)—HashCodeequals方法的關係

一、HashCode的作用 首先,想要明白hashCode的作用,必須要先知道Java中的集合。   總的來說,Java中的集合(Collection)有兩類,一類是List,再有一類是Set。 前者集合內的元素是有序的,元素可以重複;後者元素無序,但元素不可重複。