美文网首页
java虚拟机之垃圾回收器与内存分配策略

java虚拟机之垃圾回收器与内存分配策略

作者: 过期的薯条 | 来源:发表于2017-12-03 22:37 被阅读14次

    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标记-清除算法
    将无用的内存标记,然后统一清除。
    缺点:工作效率低下,会产生大量的碎片。当无法找到足够的内存的时候,不得不在执行一次回收。

    image.png

    3.2复制-清除算法
    将10M的内存,分成俩个5M的内存块。首先会使用其中一个5M的内存块。当这个内存块满了。将存活的对象,复制到另外一个5M的内存块上,一次性清楚已经满了的内存块。这样就不会产生内存碎片了。
    缺点:当存活的对象较多的时候,那么复制算法的执行效率比较低。不适合老年代。适合青年代。

    image.png

    3.3标记-整理算法
    将可回收的对象,标记,清除,然后整理内存,让存活的对象集中起来。这样就不会产生碎片。

    image.png

    3.4分代收集算法
    目前商业中经常使用的内存回收策略。对青年代使用标记-复制算法。对老年代使用标记-清除或者标记-整理算法。

    相关文章

      网友评论

          本文标题:java虚拟机之垃圾回收器与内存分配策略

          本文链接:https://www.haomeiwen.com/subject/hsfkvxtx.html