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

刘肉球,我们一起幻想的未来生活,我一定靠我的努力,实现它,人活一世,怎甘平凡

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值