<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ALL is Well!

    敏捷是一條很長的路,摸索著前進著

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      30 隨筆 :: 23 文章 :: 71 評論 :: 0 Trackbacks

    最近一段時間,在公司里對java內存泄露的問題進行了調查。

    問題的發現:

    系統中在連續不停地、反復進行一個操作(先打開A,然后切替到畫面B,點擊畫面履歷再回到A,如此反復)。經過長時間的測試,經常會20小時,JVM的內存使用量增長30M以上。

     

    問題的分析:

    首先根據操作,找到會執行的代碼,對代碼進行分析。

    Java會產生內存泄露的原因,經過本次調查,

    1.對于打開的socket等資源,沒有做及時的回收處理。
    2.生存周期較長的對象,持有了生存周期較短的對象的引用,以至于那些生存周期短的對象,在無用的情況下,沒有得到回收。
    3.對于類的成員變量為集合的情況,對集合的使用應該謹慎。比如,一個專門保存用戶操作履歷的對象,有全局變量List來保存用戶所有點擊過的鏈接。但實際項目中,不可能保存住用戶的每一次鏈接操作,然后顯示給用戶,有時候可能只是顯示最新的20條。所以這時候就要對這個全局變量進行處理,不能讓它無限的膨脹下去。
    4.在類的成員變量為集合的情況,集合中的元素又是比較復雜的對象,(這個對象中可能還包含著是集合的成員變量)在不需要此類的對象的時候,應該自己來實現對類的成員的銷毀。如:
    1Iterator itor = myMap.keySet().iterator();   
    2while (itor.hasNext()) {   
    3    MyObject selectedInfo = (MyObject) itor.next();   
    4    selectedInfo.destroy();// 假設MyObject里有destroy方法,對MyObjec中的成員進行銷毀   
    5    selectedInfo = null;   
    6}
       
    7myMap.clear();  

    5.對單態模式應該慎用,象在被初始化后將在JVM的整個生命周期中存在如果單態象持有外部象的引用,那么這個外部象將不能被回收,如故這個外部對象很龐大,那么對內存的消耗是很大的。
    6.雖然寫java程序,有GC幫助我們管理內存,但好的編程習慣還是需要的,可以避免不必要的麻煩。

    雖然寫java程序,有GC幫助我們管理內存,但好的編程習慣還是需要的,可以避免不必要的麻煩。

    1.復雜的對象,在不需要的情況下,最好能實現對它的成員的銷毀,然后再將其賦為null
    2.對于打開的流,一定要做及時的處理。另外對于HttpURLConnection對象,連接后,要調用它的disconnect(),不要對資源進行不必要的浪費。
    3.盡量少用全局變量。
    4.在哪里生成對象,就在哪里銷毀它。
    5.盡量避免對象之間的相互引用。

    最后,記述一下我記錄內存的方法。

    由于對代碼做好修改之后,要確認一下內存是否有明顯增長。

    于是寫一段代碼,每個5分鐘對對內存進行一次記錄,在連續運行20小時候,做成曲線圖,以便分析。

    (以下是為了方便,重新寫的,原來項目中用到的,有一整套完備的定時器生成和起動的管理類,這里沒有寫出來。)

     1import java.io.DataOutputStream;   
     2import java.io.FileOutputStream;   
     3import java.io.IOException;   
     4public class MemoryCollect {   
     5    public static void main(String args[]) {   
     6        MemoryCollector mc = new MemoryCollector(300000);   
     7        mc.start();   
     8    }
       
     9}
       
    10class MemoryCollector extends java.util.TimerTask {   
    11    private static final java.text.NumberFormat nf = java.text.NumberFormat   
    12            .getPercentInstance();   
    13    private static final java.text.DateFormat df = new java.text.SimpleDateFormat(   
    14            "yyyy-MM-dd HH:mm:ss");   
    15    private DataOutputStream dos = null;   
    16    private long period = 0;   
    17    private java.util.Timer timer = null;   
    18    MemoryCollector(long p) {   
    19        period = p;   
    20        timer = new java.util.Timer();   
    21    }
       
    22    public void start() {   
    23        timer.schedule(this0, period);   
    24    }
       
    25    public void run() {   
    26        System.gc();   
    27        Runtime imp = Runtime.getRuntime();   
    28        imp.totalMemory();   
    29        long totol = imp.totalMemory() / 1024;   
    30        long free = imp.freeMemory() / 1024;   
    31        try {   
    32            dos = new DataOutputStream(new FileOutputStream("D:\\memory.txt",   
    33                    true));   
    34            String date = df.format(new java.util.Date());   
    35            String info = date + "\t" + totol + "\t" + free + "\t"  
    36                    + nf.format((double) free / (double) totol);   
    37            System.out.println(info);   
    38            dos.writeUTF(info + "\r");   
    39            dos.flush();   
    40            dos.close();   
    41            dos = null;   
    42        }
     catch (Exception e) {   
    43            System.out.println(e);   
    44        }
     finally {   
    45            try {   
    46                if (dos != null{   
    47                    dos.flush();   
    48                    dos.close();   
    49                    dos = null;   
    50                }
       
    51            }
     catch (IOException e) {   
    52                e.printStackTrace();   
    53            }
       
    54        }
       
    55    }
       
    56    public void stop() {   
    57        super.cancel();   
    58        if (timer != null{   
    59            timer.cancel();   
    60            timer = null;   
    61        }
       
    62    }
       
    63}
     


    ----2009年02月02日
    posted on 2010-09-01 11:31 李 明 閱讀(1055) 評論(0)  編輯  收藏 所屬分類: 技術知識
    主站蜘蛛池模板: 亚洲AV无码一区二区一二区| 亚洲精品二三区伊人久久| 黄色免费网站在线看| 破了亲妺妺的处免费视频国产| 亚洲国产中文在线视频| 久草在视频免费福利| 最新国产精品亚洲| 成年人性生活免费视频| 亚洲国产精品18久久久久久| 国产免费69成人精品视频| 曰批免费视频播放在线看片二 | 久久精品国产亚洲AV麻豆王友容| 毛片基地看看成人免费| 久久久久亚洲精品成人网小说 | 无码专区一va亚洲v专区在线| 一级毛片在播放免费| 亚洲成Av人片乱码色午夜| 99精品一区二区免费视频| sihu国产精品永久免费| 亚洲日韩欧洲乱码AV夜夜摸| eeuss影院免费92242部| 卡1卡2卡3卡4卡5免费视频| a级成人毛片免费图片| 亚洲乱亚洲乱妇无码| 亚洲高清在线视频| 亚洲精品人成无码中文毛片| 成人女人A级毛片免费软件| 免费无码又爽又刺激高潮软件| 亚洲AV日韩AV永久无码色欲| 97亚洲熟妇自偷自拍另类图片 | 亚洲熟妇av一区二区三区| 浮力影院第一页小视频国产在线观看免费 | 亚洲国产精品尤物yw在线 | 曰批全过程免费视频网址| 羞羞视频免费网站在线看| 国产亚洲福利一区二区免费看| 亚洲日韩乱码久久久久久| 亚洲AV无码成人精品区在线观看 | 亚洲福利一区二区| 国产精品亚洲一区二区三区在线| 国产精品免费电影|