1、垃圾回收的意义:算法
在Java中,当没有对象引用指向原先分配给某个对象时,该内存便成为垃圾。实际上,除了释放没用的对象,垃圾回收也能够清除内存记录碎片。垃圾回收能自动的释放内存空间,减轻编程的负担,这Java虚拟机具备一些优势,首先,它能使编程效率提升。在没有回收机制的视乎,可能要花费许多时间来解决一个难懂的存储问题。在Java编程中,靠垃圾回收机制可大大缩短期,其次是它保存程序的完整性,垃圾回收是Java语言安全策略的重要部分。数据库
2、如何肯定一个对象是否能够被收回?编程
1.引用计数算法安全
是经过判断对象的引用数量来决定对象是否能够被回收。网络
2.可达性分析算法:数据结构
是经过判断对象的引用链是否可达来决定对象是否能够被回收。对象
3、垃圾收集算法blog
1.标记清除算法:生命周期
标记-清除算法分析和清除两个阶段。该算法首先从根集合进行扫描,对存活的对象标记,标记完毕后,再扫描整个空间中未被标记的对象并进行回收。内存
2.复制算法
复制算法将可用内存按容量划分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就将还存活的对象复制到另一块上面,而后再把已使用过的空间一次清理掉。
3.标记整理算法
标记整理算法的标记过程相似标记清除算法,但后续步骤不是直接对可回收对象进行清理,而是让全部存活的对象都想一端移动,而后直接清理掉端边界之外的内存,相似于磁盘整理过程,该垃圾回收算法使用与对象存活率高的场景。
4.分代收集算法
不一样的对象的生命周期是不同的,而不一样生命周期的对象位于堆中不一样的区域,所以对堆内存不一样的区域采用不一样的策略进行回收能够提升JVM的执行效率。
a.新生代:新生代的目标是尽量快速的收集掉那些生命周期短的对象,通常状况,全部新生成的对象首先是放在新生代的。在垃圾回收时,先将eden区存活对象复制到survivor0区,而后清空eden区,当这个survivor0也满了时,则将eden区和survivor0区存活对象复制到survivor1中,而后清空eden和这个survivor0,此时survivor0区是空的,而后交换survivor0和survivor1区的角色,即保存survivor0区空,如此往复,
b.老年代:老年代存放的都是一些生命周期较长的对象,就像上面叙述的那样,在新生代中经历了N次垃圾回收后任然存活的对象就会别放到老年代中。
c.永久代:永久代主要用于存放静态文件,如Java类,方法等
5.总结
4、垃圾收集器
若是说垃圾收集算法是内存回收算法的方法论,那么垃圾收集器就是内存回收的具体实现,有7种做用不一样的分代的收集器,其中用于回收新生代的收集器包括Serial、PraNew、Parallel Seavenge,回收老年代的收集器包括Serial Old、Parallel Old、CMS,还有用于回收整个Java堆的GI收集器,不一样收集器之间的连线表示它们能够搭配使用的。(还有一些细节,等下次用空补上)
5、内存分配与回收策略
1.对象优先在Eden分配,但Eden区没有足够空间进行分配时,虚拟机将发起一次MinorGC
2.大对象直接进入老年代
3.长期存活的对象讲进入老年代
4.动态对象年龄的断定
6、Java的内存泄漏问题:
内存泄漏是指该内存空间使用完毕以后未回收,在不涉及复杂数据结构的通常状况写,Java的内存泄漏表现为一个内存对象的生命周期超出了程序须要它的长度。
1.HashMap、Vector等集合的静态使用最容易出现内存泄漏问题,
2.各类资源链接包括数据库链接、网络链接、IO链接等没有显示调用close关闭,不被GC回收致使内存泄漏
3.监听器的使用,在释放对象的同时没有相应删除监听器的时候也可能致使内存泄漏。
7、知识点的补充
1.方法区的回收
方法区的内存回收目标主要针对常量池的回收和对类型的卸载。