美文网首页
java内存结构与垃圾回收机制

java内存结构与垃圾回收机制

作者: 小爪哇海 | 来源:发表于2018-10-10 16:45 被阅读0次

    新生代:刚出生不久的对象,存放在新生代里面,存放不是经常被使用的对象

    老年代:存放比较活跃的对象,存放经常被引用的对象

    垃圾回收在新生代比较频繁

    什么是垃圾回收机制

    • 不定时去堆内存中清理不可达对象。不可达的对象并不会马上就会直接回收, 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应该回收的,程序员也不能强制垃圾收集器回收该内存块。程序员唯一能做的就是通过调用System.gc 方法来"建议"执行垃圾收集器,但其是否可以执行,什么时候执行却都是不可知的。这也是垃圾收集器的最主要的缺点。当然相对于它给程序员带来的巨大方便性而言,这个缺点是瑕不掩瑜的。
      public class Test {
        public static void main(String[] args) {
            Test test = new Test();
            test = null;
            System.gc(); // 手动回收垃圾
        }
    
        @Override
        protected void finalize() throws Throwable {
            // gc回收垃圾之前调用
            System.out.println("垃圾回收机制...");
        }
    }
    
    

    新生代与老年代

    Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。
    在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。
    这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。

    堆的内存模型大致为:

    默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。老年代 ( Old ) = 2/3 的堆空间大小。其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,这两个 Survivor 区域分别被命名为 from 和 to,以示区分。
    默认的,Edem : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 ),即: Eden = 8/10 的新生代空间大小,from = to = 1/10 的新生代空间大小。

    根据垃圾回收机制的不同,Java堆有可能拥有不同的结构,最为常见的就是将整个Java堆分为
    新生代和老年代。其中新生带存放新生的对象或者年龄不大的对象,老年代则存放老年对象。
    新生代分为den区、s0区、s1区,s0和s1也被称为from和to区域,他们是两块大小相等并且可以互相角色的空间。
    绝大多数情况下,对象首先分配在eden区,在新生代回收后,如果对象还存活,则进入s0或s1区,之后每经过一次
    新生代回收,如果对象存活则它的年龄就加1,对象达到一定的年龄后,则进入老年代。

    相关文章

      网友评论

          本文标题:java内存结构与垃圾回收机制

          本文链接:https://www.haomeiwen.com/subject/ufppaftx.html