日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
發(fā)現(xiàn)Java虛擬機(jī)內(nèi)存泄露問題

常規(guī)理解上,Java的內(nèi)存管理機(jī)制是將局部變量保存在堆中,當(dāng)變量的作用域結(jié)束之后,該變量所占用的內(nèi)容會被自動回收。不需要做任何特殊的處理。比如下面的代碼:

 
 
 
  1. public class JavaMemory{  
  2.     private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);  
  3.     public void f(){  
  4.         {  
  5.             byte[] data1 = new byte[dataSize];  
  6.         }  
  7.         byte[] data2 = new byte[dataSize];  
  8.     }  
  9.  
  10.     public static void main(String[] args) {  
  11.         JavaMemoryPuzzle jmp = new JavaMemoryPuzzle();  
  12.         jmp.f();  
  13.     }  

在這個(gè)例子中,方法f()里定義了兩個(gè)局部變量,變量data1和data2的作用域不同。按照正常理解,雖然兩各個(gè)數(shù)組所需要的內(nèi)存之和已經(jīng)超過了可用內(nèi)存,但是因?yàn)閐ata1會被及時(shí)回收,不會出現(xiàn)內(nèi)存溢出錯誤。

如果我們實(shí)際執(zhí)行這個(gè)例子,會發(fā)現(xiàn)出現(xiàn)了java.lang.OutOfMemoryError錯誤。這是為什么?如果在BEA或者IBM的虛擬機(jī)上測試過這個(gè)例子,并不會出現(xiàn)錯誤。也就是說,SUN的JVM在內(nèi)存回收機(jī)制上存在漏洞或者BUG。

這個(gè)問題該如何修正呢,方法其實(shí)很簡單。只需要在變量作用域結(jié)束之前,將變量置為空就可以了。修改之后的結(jié)果如下:

 
 
 
  1. public class JavaMemory{  
  2.     private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);  
  3.     public void f(){  
  4.         {  
  5.             byte[] data1 = new byte[dataSize];  
  6.             data1 = null;  
  7.         }  
  8.         byte[] data2 = new byte[dataSize];  
  9.     }  
  10.  
  11.     public static void main(String[] args) {  
  12.         JavaMemoryPuzzle jmp = new JavaMemoryPuzzle();  
  13.         jmp.f();  
  14.     }  

發(fā)現(xiàn)這個(gè)問題,對于Java開發(fā)者來說也許會很緊張,擔(dān)心自己的代碼是否會出現(xiàn)同樣問題。大家盡可放心,連續(xù)出現(xiàn)兩個(gè)變量占用內(nèi)存之和超過內(nèi)存限制的情況概率非常小。并且在兩個(gè)變量之間,如果定義了其他變量也不會出現(xiàn)這個(gè)問題。如下面的代碼就不會出現(xiàn)問題:

 
 
 
  1. public class JavaMemory{  
  2.     private final int dataSize = (int) (Runtime.getRuntime().maxMemory() * 0.6);  
  3.     public void f(){  
  4.         {  
  5.             byte[] data1 = new byte[dataSize];  
  6.         }  
  7.     int i=1;  
  8.         byte[] data2 = new byte[dataSize];  
  9.     }  
  10.  
  11.     public static void main(String[] args) {  
  12.         JavaMemoryPuzzle jmp = new JavaMemoryPuzzle();  
  13.         jmp.f();  
  14.     }  

【編輯推薦】

  1. 專題:Java線程
  2. Java Swing多線程死鎖問題解析
  3. 有趣的Java對象序列化緩存問題
  4. Java實(shí)用技巧:當(dāng)不能拋出checked異常時(shí)
  5. Java編程語言的優(yōu)點(diǎn)快遞

文章名稱:發(fā)現(xiàn)Java虛擬機(jī)內(nèi)存泄露問題
鏈接地址:http://www.5511xx.com/article/copgoge.html