jvm的垃圾回收和内存

时间:2021-09-30 21:15:02

垃圾回收:

  对象的创建是我们程序员主导的,但是却没有与之相对应的delete方法来删除我们用完的对象,释放这些我们已经不需要再使用的对象的内存空间,gc:垃圾回收机制:指的就是JVM自带的一种释放无用对象占用的内存的一种手段

程序员的辅助手段:

  将引用改变为指向其他的对象(或NULL),暗示JVM ,这个对象已经没有引用指向,可以被回收;

  在方法内创建局部变量,利用弹栈的特点,使得局部变量失效;

理解:

  当我们从代码中无需再使用某个对象时,它即为无用,所占看见应被回收;

  垃圾回收机的出现可以有效的防止内存溢出和内存泄漏;

gc怎么知道该对象是否可以被回收,需了解的两种方法: 引用计数  -  对象引用遍历

注意的是:JVM主要的活动区域为 堆内存

  引用计数:

    早期的JVM使用的方法,会储存对象的所有引用数,会控制这个引用数的多少,在引用数为0的时候,则 视为可以进行垃圾回收

  对象引用遍历:

    现在大部分JVM采用的方法,从一组对象开始,沿着该对象涉及到的对象形成一个树 ( 自己理解 ),通过递归的方式,确定可达对象,不可达对象就会被视为不再需要,将其进行标记作为垃圾收集,释放对应的内存,但是释放的内存都是离散的,不是连续的,不足于装载新的对象,很多GC会有优化操作,会重新组织内存中的对象,并进行压缩,形成连续的内存空间供使用。

引用对象的强度:

  引用对象:包装了我们实际需要的对象,使我们可以直接维护对引用对象的直接引用

    可以理解为:给某个对象的引用进行了一层增强,使其拥有了其他的状态,我们可以根据他的状态进行辨别

  对象在没有任何引用指向的时候才会被当作垃圾回收,如果我们想对有引用指向的对象做垃圾回收处理,这个 时候就涉及到了引用对象的概念,引用对象的强度将决定垃圾回收器的行为,注意:我们普通使用的引用都是强度最大的引用,强度可分为一下几种:

      强可达:普通的引用

      软可达:

      弱可达:

      虚可达:

      不可达: 没有引用指向

  对象的可达性状态会触发垃圾回收期作出相应的行为:

    软可达对象可能会任凭垃圾回收器去回收;

    若可达对象将会被垃圾回收器回收;

    虚可达对象并不是真正的可达,介于可达和不可达之间,为什么说可达呢,因为它的存在可以防止对象在显式清除虚可达引用之前被回收,为什么又说他是不可达呢,因为无法通过PhantomReference访问其指称对象, 其get方法总是返回null.