java基础——垃圾回收机制
内存的管理
java内存的管理很大程度上是指对对象的管理,包括对象的空间分配和释放
对象的空间分配:使用new关键字创建对象
对象的释放:将对象赋值为null
判断是否为垃圾的算法
引用计数法
堆中的每个对象都有一个引用计数器,当对象被引用一次,就加一,置null一次就减一,变为0时,表示为无用的对象。优点:算法简单,缺点:无法对“循环引用”的对象进行识别,即俩对象互相引用,则对象的计数器永远不为0
引用可达法
将所有的引用关系看做一张图,从一个节点GCRoot开始,寻找对应的引用节点,找到所有的引用节点后,剩余的就是无用节点
垃圾的分代回收机制
分代
将对象分为3种状态:年轻代,年老代,持久代
JVN将内存分为Eden、Survivor(年轻代),old(年老代)和perm(持久代)几个区域,其中perm存在方法区中
步骤
1、新建对象绝大多数处于Eden区
2、Eden区满后,触发一次Minor GC ,清理无用对象,将有用的对象复制到s1,s2其中一个区中(两个区大小空间相同),同时清空Eden区
3、当Eden再次满后,将s1中的不能清空的对象和Eden中的对象存到另一个s区中,例如s2,同时清空Eden和s1区
4、重复多次(默认15次),S区中没有清空的对象则复制到Old区中
5、当old满后,触发一次FullGC,完整的垃圾回收
三种垃圾回收机制介绍
1、MinorGC:清理年轻代
2、MajorGC:清理年老代
3、FullGC:用于清理年老代和年轻代,成本较高,对系统的性能产生影响
JVM调优和FullGC
JVM调优中,一大部分工作是对于FullGC的调节,以下原因可能导致FullGC:
1、年老代满
2、持久代满
3、System.gc()被显示调用,表示程序员建议JVM进行FullGC,是否执行取决于JVM
4、上一次GC后,Heap各区域分配策略动态变化
易造成内存泄露的操作
1、创建大量无用对象
比如,我们在需要大量拼接字符串时,使用了String而不是StringBuilder。
String str = "";
for (int i = 0;i<10000;i++){
str += i;//相当于产生可了10000个String对象
}
2、静态集合的使用(HashMap,Vertor,List等)
3、各种连接对象未关闭(IO流,数据库连接,网络连接等)
4、监听器的使用,释放对象后,没有删除相应的监听器
注意
1、程序员无权调用垃圾回收机制,只可以提出建议
2、finalize()方法可以释放对象或资源,但是要谨慎使用
以下有更加全面的剖析,供参考借鉴,来源于百家号
https://baijiahao.baidu.com/s?id=1636852721632353675
刘肉球,我们一起幻想的未来生活,我一定靠我的努力,实现它,人活一世,怎甘平凡