zoukankan      html  css  js  c++  java
  • JVM-5-GC(Garbage Collection) 垃圾回收机制

    GC(Garbage Collection)  垃圾回收机制
     
    什么是垃圾回收机制
    垃圾回收是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用,以免造成内存泄露。
     
     
    内存中已经不再被使用到的空间就是垃圾
     
    c的垃圾回收是人工的,工作量大,但是可控性高。
    java是自动化的,但是可控性很差,甚至有时会出现内存溢出的情况,
    内存溢出也就是jvm分配的内存中对象过多,超出了最大可分配内存的大小。
     
    System.gc()用于调用垃圾收集器,在调用时,垃圾收集器将运行以回收未使用的内存空间。它将尝试释放被丢弃对象占用的内存。
    然而System.gc()调用只是声明,无法保证对垃圾收集器的调用。
    所以System.gc()并不能说是完美主动进行了垃圾回收。
     
     
    一  jvm怎么确定哪些对象应该进行回收
     
    对象是否会被回收的两个经典算法:引用计数法,可达性分析算法。
     
    引用计数法
    JVM为每个对象维护一个引用计数,假设A对象引用计数为零说明没有任务对象引用A对象,那A对象就可以被回收了,但是引用计数有个缺点就是无法解决循环引用的问题。
     
    可达性分析算法
    为了解决引用计数法的循环引用问题,Java 使用了可达性分析的方法。
    GC Roots通过一系列的名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明对象是不可用的。
    在Java中,可以作为GC Roots的对象包括下面几种:
    * 虚拟机栈中引用的对象;
    * 方法区中类静态属性引用的对象;
    * 方法区中的常量引用的对象;
    * 本地方法栈中JNI(即一般说的Native方法)的引用的对象;
     
    总的来说就是当一个对象通过GC Roots搜索不到时,说明对象可以被回收了,但什么时候回收还要看GC的心情!
     
    二在确定了哪些对象可以被回收之后,jvm会在什么时候进行回收
     
    1会在cpu空闲的时候自动进行回收
    2在堆内存存储满了之后
    3主动调用System.gc()后尝试进行回收
     
     
     
     
    古人学问无遗力,少壮工夫老始成。 纸上得来终觉浅,绝知此事要躬行。
  • 相关阅读:
    SQL强化
    JSP深入
    会话Session和cookie
    SQL快速入门
    小程序 + node koa2 session存储验证码碰到最大的坑,(喜极而泣 /狗头)
    mongoose 数据如果存在更新 不存在插入
    vue 相同路由不同参数跳转时,不刷新
    因为自己的小服务器读取太慢,弄一个本地的mysql
    git 提交代码不想包括那个文件,比如node_modules
    js中 ! 和 !!
  • 原文地址:https://www.cnblogs.com/wf-zhang/p/11965848.html
Copyright © 2011-2022 走看看