1、定位需要回收算法的 ①引用计数法;②根可达算法;可达性分析;
2、GC算法:mark-sweep标记清除;Coping拷贝;Mark-compact标记压缩; 没有解释清除
mark-sweep标记清除;带来的问题--->内存碎片化;
Coping拷贝;解决了碎片化------>浪费内存;整理的存或的对象复制到另一片内存区域,清 除来及对象;
Mark-compact标记压缩:整理存活的对象放在一起;------>效率低下;
3. 垃圾回收器:基于垃圾回收算法写的回收器;
4、java的四种引用类型:强软弱虚
强引用: new 的对象 对象赋值为null;即引用消失了,此时此对象就会被标记为垃圾对象;
软引用:对象,适合用于缓存;new SoftReference(new obj2) ; 当被指向的对象的存在扩容, 时就会存在垃圾回收。
弱引用:new WeakReference(new byte[1024]); 遇到垃圾回收器的时候就会被回收;是为了解 决某些内存泄露的问题。
虚引用:PhantomReference demo:new PhantomReference(new byte[11], Queue);管理对战内 存。堆外内存,由操作系统来管理。jvm回收之前 会把指向的对象放在队列中,由操作 系统来回收这些内存。
5、ThreadLocal: 当前线程的 当前线程的map 存放的是当前的ThreadLocal对象作为key,value就 是传进来的值 这个值可以是对象。
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
用强引用的话 会导致内存泄漏。存放的key指向的ThreadLocal 。弱引用只要遇到垃圾回收就会 被回收。用完之后必须ThreadLocal .remove() 否则依然存在内存泄漏。
6、CMS垃圾收集器:
初始标记----->并发标记------>重新标记------>并发清理
程序运行的时候,就开始标记,在这个过程中,可能会产生错误的标记。
重新标记 会从头进行标记一遍。
7、Epsilon debug jvm;
8、G1 分区算法和动态回收;物理不分代,逻辑分代。年轻代(survivor,edon),老年代
9、ZGC 分页回收算法,平均耗时1.68ms,不在分区进行回收,定时去触发垃圾回收;
10、ps/po
spring事务使用的就是 ThreadLocal
JVM 调优: