java核心-JVM-gc面試題


1.寫一個memory leak的例子

public class MemonyLeak {

    //1.memoryLeak內存泄漏
    /*
        這類錯誤報錯具體顯示:java.lang.OutOfMemoryError: java heap space
        導致原因,是gc無法回收不再使用的對象,這些無用的對象導致堆內存不足。
        通常有成員變量或全局變量導致,解決辦法就是定義好變量的作用范圍
     */

    Map<String, List<String>> a;

    public void printSomething(){

        ArrayList<String> content = new ArrayList<>();
        for(int i=0;i<10000000;i++){
            content.add(i+i+i+i+System.currentTimeMillis()+"");
        }
        a = new HashMap<>();
        a.put("aa", content);
        System.out.println(a.hashCode());
    }


    public static void  main(String[] args){
        MemonyLeak memonyLeak1 = new MemonyLeak();
        memonyLeak1.printSomething();
        MemonyLeak memonyLeak2 = new MemonyLeak();
        memonyLeak2.printSomething();
        MemonyLeak memonyLeak3 = new MemonyLeak();
        memonyLeak3.printSomething();
        MemonyLeak memonyLeak4 = new MemonyLeak();
        memonyLeak4.printSomething();
        MemonyLeak memonyLeak5 = new MemonyLeak();
        memonyLeak5.printSomething();
        MemonyLeak memonyLeak6 = new MemonyLeak();
        memonyLeak6.printSomething();
    }
}

執行了好半天,結果報錯了

解決辦法:

將成員變量寫到方法printSomething()里面
    public void printSomething(){
        Map<String, List<String>> a;
        ArrayList<String> content = new ArrayList<>();
        for(int i=0;i<10000000;i++){
            content.add(i+i+i+i+System.currentTimeMillis()+"");
        }
        a = new HashMap<>();
        a.put("aa", content);
        System.out.println(a.hashCode());
    }

執行結果

可見對於內存泄漏的問題可能來源了對象的作用域定義不合理,成員變量或全局變量的對象作用域比較寬,gc來不及回收容易造成內存泄漏


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM