回顾一下java内存区域划分:
1、Heap中主要保存对象
2、垃圾回收:java程序员只需要将对象给new出来,扔到heap中,但是从来不把它delete掉,所以需要有垃圾回收机制来删掉这些对象。而这其中也涉及到一些算法
如 可达性分析算法:橙色的对象都是不可达对象,可以回收
3、Heap的详解
可以把Heap想象成一大片空间,为了方便管理,把heap划分为多个区域,然后把那些java对象在其中搬来搬去。
规定:新创建出来的对象,是保存在新生代中的,如果新生代住不下了,就进行垃圾回收(Minor GC),回收以后还住不下,那就把一些寿命比较就的对象转移到老年代中去。如何区分对象的寿命呢?在heap中的对象都会设置一个年龄计数器,每次java对象经历过一次GC,那么就将年龄加1.
为什么要在新生代分出Eden、Survivor1、Survivor2这样的区域呢?(Eden意思是伊甸园,在圣经中应该是象征着无忧无虑的好地方)
这是因为想要实现一个复制算法:
分为两个区域,每次只用其中的一个。当区域1用完了,就做垃圾回收,把存活的都搬到另外一个区域。这种来回颠倒使用两个区域,虽然效率高,没有碎片,但是浪费的空间很巨大,每次只能用一半!后来发现了规律,大部分在新生代的对象都活不了多长时间,基本上一次垃圾回收就删除得差不多了。所以对这个算法进行了改进,将新生代分为了三个部分:Eden、Survivor1、Survivor2,他们的比例是8:1:1
每次只使用Eden和其中一个Survivor,当垃圾回收时,把这两块区域中还活着的对象复制到另外一个Survivor,如果Survivor放不下,就放入老年代。如果老年代也满了, 那么就能做一次Full GC!
4、Off-Heap—堆外内存
复制数据太麻烦了,可以在java代码中直接分配一块属于off-heap的内存。