1.引言
最近在看jvm的书籍。感觉讲的不错,自己把一些有意思的地方,记录下,增加印象。
2.正题
2.1 GC垃圾回收器,回收的垃圾是什么?
定义: 没有直接或者间接与GCRoots相通的对象,都是GC回收的对象,也就是"垃圾"。
2.2什么是GCRoots
GCRoot 个人理解为是一个除Object之外的对象。能作为GCRoots的对象大部分存在于以下几种地方.
1.虚拟机栈中引用的对象: 虚拟机栈里面保存的是栈帧,栈帧里面有变量表。变量表中有些引用变量。
2.方法区保存着类信息,常量,静态变量,静态的引用变量,也会是GCRoot
3.方法区中常量对象,用final修饰的对象。
2.3四种引用类型
jdk版本1.2之前,一个对象只有引用和被引用俩种状态。后来人们发现这种定义的方式太狭隘了。于是出现了强引用,软引用,弱引用,虚引用。
强引用:指的是Student a=new Student(); 这样方式的生成的对象。在任何时候哪怕报错,也不会主动去回收这部分的内存。
软引用:SoftReference<Object> sf = new SoftReference<Object>(obj); 这样来声明对象的方式称之为软引用。当内存不够的时候,会主动回收软引用对象。
弱引用:WeakReference<Object> wf = new WeakReference<Object>(obj); 这样来声明对象的方式的成为弱引用。不管内存够都进行回收。
3.内存回收算法
3.1标记-清除算法
将无用的内存标记,然后统一清除。
缺点:工作效率低下,会产生大量的碎片。当无法找到足够的内存的时候,不得不在执行一次回收。
3.2复制-清除算法
将10M的内存,分成俩个5M的内存块。首先会使用其中一个5M的内存块。当这个内存块满了。将存活的对象,复制到另外一个5M的内存块上,一次性清楚已经满了的内存块。这样就不会产生内存碎片了。
缺点:当存活的对象较多的时候,那么复制算法的执行效率比较低。不适合老年代。适合青年代。
3.3标记-整理算法
将可回收的对象,标记,清除,然后整理内存,让存活的对象集中起来。这样就不会产生碎片。
3.4分代收集算法
目前商业中经常使用的内存回收策略。对青年代使用标记-复制算法。对老年代使用标记-清除或者标记-整理算法。
网友评论