新生代概念理解

4大垃圾回收思想:

引用计数    ,      复制( 新生代 )   ,     标记清除 和 标记整理 (老年代)

 

 

什么时候会进行新生代的垃圾回收?

新生代里eden区和survivor1区空间快满了,就会触发MinorGC,把存活的对象移动到survivor2区中。

接着,就使用eden和survivor2区来分配新的对象。

 

 

新生代满了哪些引用的对象是不能回收的? JVM中使用了一种GCRoot的可达性分析算法,通过对每个对象,都分析一下有谁在引用他,然后一层一层往上去判断,看是否有一个GC Roots。     新生代回收后,什么对象会进入老年代? 1.躲过默认的15次垃圾回收的对象 2.动态年龄判断:当前存放的survivor区域,相同年龄的一批对象大于这块survivor区域的内存大小的50%,那么这批对象就可以直接进入老年代 3.大对象直接进入老年代,可以通过 " -XX:PretenureSizeThreshold" 设置为字节数, 1048576 字节 就是1M   (为了避免大对象,多次GC回收不掉,在 s0  s1复制来复制去,影响性能)       Java中对象的引用类型有那些? 强引用:就算OOM也不会对对象进行回收,会造成内存泄漏
    public static void main(String[] args) {
        Object obj1 = new Object();
        Object obj2 = obj1;
        obj1 = null;
        System.gc();
        System.out.println(obj1);    // null                      obj1已经被回收
        System.out.println(obj2);    //java.lang.Object@74a14482  obj2没有被回收
    }
  软引用:内存足够不进行回收,内存不够的话才进行回收   VM options: -Xms20M -Xmx20M   常用于:用HashMap来保存图片的路径 和 相应图片关联的软引用之间的映射关系,避免OOM的问题
    public static void main(String[] args) {
        Object obj1 = new Object();
        SoftReference<Object> softReference = new SoftReference<>(obj1);
        System.out.println(softReference.get());
        obj1 = null;
        try {
            Byte[] bytes = new Byte[30 * 1024 * 1024];
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println(softReference.get());
        }
    }
//        java.lang.Object@74a14482
// null
// Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
// at suanfa.HashMapTest.main(HashMapTest.java:24)

 

弱引用:只要垃圾回收机制一运行,就会进行回收

虚引用:不常用,一般用于监控对象的回收信息

   
上一篇:关于C#7 新语法糖


下一篇:Javascript/js 的浅拷贝与深拷贝(复制)学习随笔