• JVM的垃圾回收机制(GC)


    1.什么是垃圾回收
                    程序运行会产生各种各种的数据,那么这些数据存在于内存当中,这些数据不可能是永久存在的,无效的资源对象需要进行垃圾回收,释放内存
                2.不同的编程语言都有GC垃圾回收
                    java语言自带GC垃圾回收器,并且有JVM自动进行垃圾回收,程序员主要关注代码实现,不关注垃圾回收 System.gc();
                    C/C++语言当中,程序员new一个对象,相当于申请了一块内存,如果需要释放资源得手动通过delete关键字进行内存的释放
                3.垃圾回收算法
                    如果使用的算法不合理,反倒会造成资源的浪费,垃圾回收常见算法
                    3.1 引用计数法
                        原理:假如有一个对象A,任何对象对A对象的引用,计数器就+1,当引用失效或者失败时计数器-1,如果对象A的计数器为0,GC就会当成对象没有
                                引用了,就会将该对象回收
                    3.2 标记清除法
                        标记:从根节点开始标记引用对象
                        清除:未被标记的对象就是垃圾对象,可以清除
                        

           

           


                        原理:初始状态下所有对象的标记都为0,当内存不足的情况下,
                              标记阶段:GC先会进行标记阶段,从根节点开始,凡是引用的对象都标记为1,其他没有引用的对象标记为0
                              清除阶段:凡是对象标记为1代表该对象存在引用不清除,对象标记为0则清除,清除完毕之后所有对象重新标记为0
                        
                        缺点:    
                            1.效率较低,标记和清除两个动作都需要遍历所有的对象,并且在GC时,需要停止应 用程序,对于交互性要求比较高的应用而言这个体验是非常差的。
                            2.碎片化较为严重,可能导致大数据没有办法存储,小数据存储浪费空间
                                
                        
                        
                    3.3 标记压缩算法
                        同标记清除法相同,标记过程相同,在清除过程中,先将垃圾对象压缩到内存末尾,然后再清除
                        缺点:对象需要移动,效率有一些影响

          


                        
                    3.4 复制算法
                        内存被分为大小相同两块区域,一块为From,一块为To,程序向From区域存放数据,当from数据即将满了的情况下,进行垃圾回收:首先标记垃圾对象,

          然后将没有标记的对象复制到To当中,然后回头将From所有区域清空,然后角色交换,From和To交换,保证To永远为空
                        1.年轻代当中分为Eden去和From和To区,其中From和To区的大小时相同的,程序向Eden去和From区存放数据,当数据即将满了的情况下
                        2.Eden区会将活跃对象存放到To区,From区会将年龄小的对象存放到To区,那么年龄大的存放到Old年老代区域当中
                        3.清空Eden去和Old区的所有数据,然后将From区角色和To区角色互换,这样保证To区为空
                        4.当垃圾回收机制反复运行时,那么To区可能数据饱和,如果数据饱和则将所有对象转移到Old年老区
                        
                        

                    3.5 分代算法

        前面介绍了多种回收算法,每一种算法都有自己的优点也有缺点,谁都不能替代谁,所以根据垃圾回收对象的特点进行选择,才是明智的选择。
        分代算法其实就是这样的,根据回收对象的特点进行选择,在jvm中,年轻代适合使用复制算法,老年代适合使用标记清除或标记压缩算法。
  • 相关阅读:
    AngularJS Insert Update Delete Using PHP MySQL
    Simple task manager application using AngularJS PHP MySQL
    AngularJS MySQL and Bootstrap Shopping List Tutorial
    Starting out with Node.js and AngularJS
    AngularJS CRUD Example with PHP, MySQL and Material Design
    How to install KVM on Fedora 22
    Fake_AP模式下的Easy-Creds浅析
    河南公务员写古文辞职信
    AI
    政协委员:最大愿望是让小学生步行上学
  • 原文地址:https://www.cnblogs.com/chx9832/p/12419569.html
Copyright © 2020-2023  润新知