java的垃圾处理
carbage collection
性能优化老大难,垃圾处理先循环。
调用gc 欲 清 堆 ,仅是建议位难归。
引用计数恐循环,可达算法找点难。
分代处理开外挂,青年耄耋持久化。
当程序员手动调用gc();
//仅仅是一个建议 不一定调用就会执行垃圾处理行为
System.gc();
引用计数:指的是将所有的对象被引用的次数记下如果引用是零那么久回收这个对象,对于循环引用无能为力
public class Person {
String name;
Person per;
public static void main(String[] args) {
//循环引用
Person p1 = new Person();
Person p2 = new Person();
p1.per = p2;
p2.per = p1;
p1 = null;
p2 = null;
}
}
循环引用内存图
引用统计:将所有的引用看做一张图出来然后观察引用数量的变化
形成一个gcroot tree 然后挨个寻找引用节点 先找到 一个节点然后去另一端找 如果没有找到的话则认为这个没有被引用
分代垃圾回收
jvm将内存分为 Eden Survivor Tenured
年轻代:出生存在Eden 区 对应清理机制 是 minor gc();
年老代:默认是指年轻代中经历了15次排查还存活的对象 启动major jc() 和full JC();
全面清理
持久代:不会被清理
垃圾清理过程
**1。**首先产生的对象回归、被放到eden区当eden区满了之后调用minor GC(); 将没有被清除的对象存放到survivor 1 或者是 survivor2 中
**2。**然后再次产生新对象 重复步骤1 然后同时还要排查survivor区 将来回查找15次都没有死亡的对象放到 tenured 区
**3。**当老年区满了之后会处罚major gc() 和 full gc ()
full gc() 启动成本高会对系统产生影响