面试官:
    jvm运行时内存模型了解过吗?说一说。
    我:
    ……….
    内存模型分为:
    程序计数器:由于CPU的高速切换,可能导致线程可能中断,计数器就可以标记程序执行到哪里,回来后继续执行。
    堆空间:主要存放我们New出来的对象和常量池。
    虚拟机栈:普通方法
    本地方法栈:native修饰的方法。
    1.7之前 有方法区,1.8过后改为了元空间 储存class对象信息,方法的定义啊,静态变量等待。

    堆空间又分为:新生代老年代 默认情况是1:2。新生代里面又分为:伊甸园区Eden幸存者区survival。幸存者区又分为相等的两部分 FromTo,默认是8:1:1。当然都可以调整哈(根据实际情况参数调优)。
    堆空间之所以分这么细,是因为它主要存对象嘛。新建对象都在年轻代,经过多次Gc垃圾回收都还活着的对象就放到老年代。之前是有个永久代的,1.8版本后放在了元空间,就相当于没有了。
    面试官:
    那你说说垃圾回收吧!
    我:
    小意思,正中下怀。
    首先,我们需要发现垃圾再去标记处理垃圾。现在我们一般都用那个叫什么来着,可达性分析 来搜索。就是通过一个节点GC ROOT(正在引用的对象嘛!比如两个栈中的引用对象,方法区中静态属性的引用对象和常量的引用对象) 寻找它下面所有的引用节点,一层层筛选。找完后其他的节点就被当成垃圾回收。
    垃圾回收有几个常见的算法。 标记清除,相当于全盘扫描,效率不高还会产生大量不连续的内存碎片。标记整理,整理就是移动位置嘛,将存活的对象放到一起,虽然没有内存碎片了,但是不停地移动位置也会消耗性能,效率也不高。复制算法,将可用内存一分为二,一边装满了再复制到另一边,然后回过头来清理。虽然有点小优化但是可使用内存只有原来一半。最后我们现在用的是分代搜集算法。
    随便组织语言:
    from和to 会相互复制(可以理解为互相交换位置,保证一个区域为空),当年龄达到默认的15或者对象比较大时就会进入老年代。
    Minor GC Eden区回收,频率高 和 Full GC 老年代回收,频率低。