各种垃圾回收算法都有各自的优缺点。jvm也并没有只采用一种垃圾算法。并提供几种组合供我根据场景进行选择。
jvm内存结构
Person p=new Person();
1.程序里面创建一个对象会向向eden区和from区申请空间
2..当eden区和from区内存紧张则会触发(Scavenge GC)将非垃圾对象复制到to区,并将to区的纯活对象年龄+1(如果to区满了存放不下剩余的纯活对象则会移动到老年代)
3.回收eden区和from区的垃圾对象。并将to和from调换位置
4.后面每次回收纯活对象的年龄都会+1 当年龄到达15则移动到老年代
5.当老年代内存紧张则会触发(Full GC) 回收老年代垃圾对象
因为老年代使用标记清除法,所以会导致程序全局暂停,
比如:
比如一个生日聚会。你一边打扫房间 别人一边制造大量垃圾,会导致垃圾永远清理不完
全局暂停的影响
比如做了主从, 当主机因为全局暂停, 从监测到以为主机挂掉了。这个时候从机切为主机。 这个时候主机执行完清理 重新开始运行程序。这个时候会导致数据不一致问题、
我们在实际中应当合理调节老年代大小
还有前面说了 因为from区和to区容纳不了纯活对象会自动担保放到老年代,会照成本来纯活时间不长的对象 到了老年代。占用老年代内存 导致fullgc 所以 新生代的内存也要根据合理调配。
JVM提供的几种垃圾回收器
串行收集器
特点:
最老的一种垃圾回收期 ,稳定,效率高
采用单线程回收
新生代采用复制算法 老年代采用标记压缩算法
参数配置: -XX:+UseSerialGC
ParNew
特点:
新生代并行回收 老年代串行回收
并行回收需要cpu多核支持
参数配置:-XX:+UseParNewGC
可以使用 -XX:ParallelGCThreads设置回收线程数量
Parallel收集器
特点:
类似ParNew
G1回收器