what?是什么?:
GC 垃圾回收机制,是jvm对内存对象回收的一种机制
why?垃圾是什么?为什么有这个机制?
程序在运行过程中会产生很多对象,或者是数组等,当方法结束后这些对象并没有被销毁,还占用着内存,没有垃圾回收机制,久而久之内存就会消耗殆尽。
HOW?:如何回收(即回收算法)?回收执行器有哪些?
Java内存分为:新生代、老年代、元区间,元区间放一些常量不会回收,所以只对新生代老年代进行回收
新生代:Eden、S0、S1区域,采用的回收算法是复制算法,因为效率高速度快。具体做法是:当有新对象创建时先从Eden区域划分内存给新对象,如果发现内存不足以提供时,就会触发一次scavenge GC回收Eden和s0区域,幸存的对象会复制到s1区域,清空Eden和s0区域。
老年代:在新生代经历多次gc仍然存活的对象会被复制到老年代,当老年代的内存不足时,会触发一次full GC,回收老年代对象。回收算法采用标记-整理法,具体做法是,标记需要存活的对象,计算新的地址,往一边区域挪,整理完成后,清空另一边整块内存区域。
回收器有:
1⃣️串行垃圾回收器:会暂停应用线程,执行GC线程,适合单核cpu,暂停应用无感的程序
2⃣️并行垃圾回收器:也会暂停应用线程,但是是多线程执行gc,适合多核cpu,对暂停应用无感的程序
3⃣️cmg并发标记扫描器:多线程扫描标记需要清理的对象,保证了最短的暂停时间
4⃣️G1垃圾回收器:将要回收的内存分为几个区域,也有eden区,s0区
发现哪些无用信息对象常用算法:
引用计数法(有对象引用时加1,丢弃时减1,为0)、根搜索法
回收无用信息对象占用的内存常用算法:
标记清除算法、复制算法(老年代、新生代)
GC的执行机制:
1、scavenage GC:当新对象生成申请Eden区域空间申请失败时,就会触发Scavenge GC,对Eden域进行GC。这种GC是对年轻代的Eden进行,不会影响老年代
2、Full GC:对整个堆进行整理,包括Young、Tenured和Perm
Java性能调优方法:
1、不要用system.gc(),因为对增加gc频率
2、不用的对象显示标记为NULL, 好判定
3、尽量用StringBuild代替string,因为string底层是final修饰的,不会被回收。用int基本类型代替Integer包装类型对象
4、合理使用静态变量,静态变量不会被回收占用内存