垃圾回收机制
内存管理很大程度指:堆中对象的管理
一般垃圾回收算法做两件事
1.发现无用对象
2.回收无用对象占用的内存空间
垃圾回收相关算法
1.引用计数法
每个对象都对应一个引用计数器,当无引用时计数为0,则进行回收
算法简单
缺点是“循环引用的无用对象无法识别”。即对象之间互相引用,实际上该对象已经无用。
2.引用可达法(根搜索算法)
把所有的引用关系看作一张图
所有引用节点寻找完毕后,剩余没有被引用的则被回收
通用的分代垃圾回收机制
1.年轻代(Eden区)
2.年老代(Survivor区)
3.永久代(Tenured/Old)
Minot GC:用于清理年轻代区域
Major GC:用于清理年老代区域
Full GC:用于清理年轻代。年老代区域。成本较高,会对系统性能产生影响。
对JVM调优的过程中,很大一部分工作就是对Full GC的调节。
以下原因可能导致Full GC
1.年老代(Tenured)被写满
2.永久代(perm)被写满
3.System.gc()被显示调用
4.上一次GC之后heap的各域分配政策动态变化
注1.程序员无权调用垃圾回收器
2.程序员调用System.gc(),只是通知JVM,并不是运行垃圾回收器,尽量少用,会申请Full GC 成本高,影响性能。
3.finalize方法,是java提供给程序员用来释放对象或资源的方法,但是尽量少用。
开发中容易泄露内存的操作
1.创建大量无用对象
比如,在我们需要大量拼接字符串时,使用了String而不是StringBuilder。
2.静态集合类的使用
3.各种连接对象(IO流对象、数据库连接对象、网络连接对象)未关闭
这些对象属于物理连接,和硬盘或者网络连接,不使用的时候一定要关闭
4.监听器的使用
释放对象时,没有删除相应的监听器