JVM 垃圾回收
目的:
将JVM中堆中不再使用的对象占用的空间释放,回收内存资源。
需要解决的问题:
1.那些对象不再被使用,可以被回收?
从根(栈变量、静态变量)开始标识,如果对象被引用即为存活。再从标记的对象出发,继续进行标记。
2.如何回收,回收方法?
清理:将垃圾对象的空间标记为可用,分配对象空间时,可以使用这部分空间;
压缩:以堆空间起始位置为准,将存活对象依次排列,将剩余的空间变为连续的;
复制:将堆空间分成两部分,先在一个上面分配空间,当但满后,将存活对象移至另一部分;
JVM
1)Web的请求处理过程中,创建的对象生命周期都很短,直接在Eden区分配空间;
2)当Eden区满时,对Eden区进行标记和回收,将存活对象移至From区。Eden和To区为空;
如果From区满会怎么样? 启动第3)步。
3)当Eden区满时,对Eden和From区一同进行标记和回收,将存活的对象移至To区。Eden和From区为空;
如果To区满会怎么样?对象移至老年代。
4)Eden再满时,对Eden和To区一同进行标记和回收,将存活对象移至From区。Eden和To区为空;
5)对象经过多次From和To之间转移,仍然存活,会进入老年代;
6)当老年代满,即To无法移至老年代,进行新+老的全部垃圾回收。
3.回收过程中内存如何管理?
G1垃圾回收内存管理
将Eden、Survivor、Old、Humongons四种类型,分成多个块,已减少回收时的stop时间。
4.用什么样的过程进行回收,即回收算法?
串行回收器:单核CPU,有一个回收线程即可。回收期间应用程序线程要阻塞,即stop the world;
并行回收器:多核CPU,多个线程进行回收,减少stop时间;
并发回收器CMS:分4个阶段,初始标记、并发标记、重新标记(stop)、并发清理;
G1回收器:标记(stop)、并发清理;
评论