原因: 常見的有以下幾種:
成都創(chuàng)新互聯(lián)專注于鎮(zhèn)賚網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供鎮(zhèn)賚營銷型網(wǎng)站建設(shè),鎮(zhèn)賚網(wǎng)站制作、鎮(zhèn)賚網(wǎng)頁設(shè)計、鎮(zhèn)賚網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造鎮(zhèn)賚網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供鎮(zhèn)賚網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
1.內(nèi)存中加載的數(shù)據(jù)量過于龐大,如一次從數(shù)據(jù)庫取出過多數(shù)據(jù);
2.集合類中有對對象的引用,使用完后未清空,使得JVM不能回收;
3.代碼中存在死循環(huán)或循環(huán)產(chǎn)生過多重復(fù)的對象實體;
4.使用的第三方軟件中的BUG;
5.啟動參數(shù)內(nèi)存值設(shè)定的過??;
常見錯誤提示: 1.tomcat:java.lang.OutOfMemoryError: PermGen space
2.tomcat:java.lang.OutOfMemoryError: Java heap space
3.weblogic:Root cause of ServletException java.lang.OutOfMemoryError
4.resin:java.lang.OutOfMemoryError
5.java:java.lang.OutOfMemoryError
解決:
設(shè)置運用服務(wù)參數(shù)(把內(nèi)存改大點):
args="-Xms128m -Xmx888m"
換個實現(xiàn)方式。
try {
// 讀取圖片文件
is = new FileInputStream(srcpath);
/**
* 返回包含所有當(dāng)前已注冊 ImageReader 的 Iterator,這些 ImageReader 聲稱能夠解碼指定格式。 參數(shù):formatName - 包含非正式格式名稱 . (例如 "jpeg" 或 "tiff")等 。
*/
IteratorImageReader it = ImageIO.getImageReadersByFormatName("jpg");
ImageReader reader = it.next();
// 獲取圖片流
iis = ImageIO.createImageInputStream(is);
/**
* iis:讀取源.true:只向前搜索.將它標(biāo)記為 ‘只向前搜索’。 此設(shè)置意味著包含在輸入源中的圖像將只按順序讀取,可能允許 reader 避免緩存包含與以前已經(jīng)讀取的圖像關(guān)聯(lián)的數(shù)據(jù)的那些輸入部分。
*/
reader.setInput(iis, true);
/**
* p
* 描述如何對流進(jìn)行解碼的類
* p
* .用于指定如何在輸入時從 Java Image I/O 框架的上下文中的流轉(zhuǎn)換一幅圖像或一組圖像。用于特定圖像格式的插件 將從其 ImageReader 實現(xiàn)的 getDefaultReadParam 方法中返回 ImageReadParam 的實例。
*/
ImageReadParam param = reader.getDefaultReadParam();
/**
* 圖片裁剪區(qū)域。Rectangle 指定了坐標(biāo)空間中的一個區(qū)域,通過 Rectangle 對象 的左上頂點的坐標(biāo)(x,y)、寬度和高度可以定義這個區(qū)域。
*/
Rectangle rect = new Rectangle(x, y, width, height);
// 提供一個 BufferedImage,將其用作解碼像素數(shù)據(jù)的目標(biāo)。
param.setSourceRegion(rect);
/**
* 使用所提供的 ImageReadParam 讀取通過索引 imageIndex 指定的對象,并將 它作為一個完整的 BufferedImage 返回。
*/
BufferedImage bi = reader.read(0, param);
// 保存新圖片
ImageIO.write(bi, "jpg", new File(subpath));
}catch(Exception e){
e.printStackTrace();
}
finally {
if (is != null)
is.close();
if (iis != null)
iis.close();
}
似乎是Tomcat出現(xiàn)了問題,你能否把那個:(D:\Java\apache-tomcat-6.0.20\bin\hs_err_pid6076.log)文件中的最后日志記錄上傳上來看看?好像是內(nèi)存托管出現(xiàn)了異常,和Java虛擬機沒有關(guān)系
1,線程正常執(zhí)行完畢,正常結(jié)束。 2,監(jiān)視某些條件,結(jié)束線程的不間斷運行。 3,捕獲InterruptedException 運行時異常,中斷當(dāng)前線程。 也不知道對不對,湊合著看吧。
相信大家在使用電腦的時候都有過這樣的現(xiàn)象,就是在運行一個程序的時候,突然發(fā)現(xiàn)不需要了或者是需要啟用其他軟件的時候,我們會強制關(guān)閉這個軟件的啟動過程,浙江java培訓(xùn)認(rèn)為這個行為在java編程開發(fā)中就叫做線程的中斷。
每一個線程都有一個boolean類型標(biāo)志,用來表明當(dāng)前線程是否請求中斷,當(dāng)一個線程調(diào)用interrupt()方法時,線程的中斷標(biāo)志將被設(shè)置為true。
我們可以通過調(diào)用Thread.currentThread().isInterrupted()或者Thread.interrupted()來檢測線程的中斷標(biāo)志是否被置位。
這兩個方法的區(qū)別是Thread.currentThread().isInterrupted()是線程對象的方法,調(diào)用它后不清除線程中斷標(biāo)志位;而Thread.interrupted()是一個靜態(tài)方法,調(diào)用它會清除線程中斷標(biāo)志位。
一般來說中斷線程分為三種情況:(一):中斷非阻塞線程(二):中斷阻塞線程(三):不可中斷線程(一):中斷非阻塞線程中斷非阻塞線程通常有兩種方式:(1)采用線程共享變量這種方式比較簡單可行,需要注意的一點是共享變量必須設(shè)置為volatile,這樣才能保證修改后其他線程立即可見。
(2)采用中斷機制(二):中斷阻塞線程當(dāng)線程調(diào)用Thread.sleep()、Thread.join()、object.wait()再或者調(diào)用阻塞的i/o操作方法時,都會使得當(dāng)前線程進(jìn)入阻塞狀態(tài)。
那么此時如果在線程處于阻塞狀態(tài)是調(diào)用interrupt()方法設(shè)置線程中斷標(biāo)志位時會出現(xiàn)什么情況呢!此時處于阻塞狀態(tài)的線程會拋出一個異常,并且會清除線程中斷標(biāo)志位(設(shè)置為false)。
這樣一來線程就能退出阻塞狀態(tài)。
當(dāng)然拋出異常的方法就是造成線程處于阻塞狀態(tài)的Thread.sleep()、Thread.join()、object.wait()這些方法。
需要注意的地方就是Thread.sleep()、Thread.join()、object.wait()這些方法,會檢測線程中斷標(biāo)志位,如果發(fā)現(xiàn)中斷標(biāo)志位為true則拋出異常并且將中斷標(biāo)志位設(shè)置為false。
所以while循環(huán)之后每次調(diào)用阻塞方法后都要在捕獲異常之后,調(diào)用Thread.currentThread().interrupt()重置狀態(tài)標(biāo)志位。
(三):不可中斷線程有一種情況是線程不能被中斷的,就是調(diào)用synchronized關(guān)鍵字和reentrantLock.lock()獲取鎖的過程。
但是如果調(diào)用帶超時的tryLock方法reentrantLock.tryLock(longtimeout,TimeUnitunit),那么如果線程在等待時被中斷,將拋出一個InterruptedException異常,這是一個非常有用的特性,因為它允許程序打破死鎖。
你也可以調(diào)用reentrantLock.lockInterruptibly()方法,它就相當(dāng)于一個超時設(shè)為無限的tryLock方法。
如果是用eclipse自帶的tomcat,那么打斷點以后,如果程序經(jīng)過斷點,就會直接停住,進(jìn)入debug模式;如果是用的server啟動,需要右鍵debug模式啟動.
如果是突然掛掉,那么控制臺報了什么錯么