Java的垃圾回收机制详解——从入门到出土,学不会接着来砍我!

文章目录

  • 哪些内存需要回收
  • 回收堆:垃圾的定义
    • 引用计数算法:
    • 可达性分析算法:
      • GC Roots的对象
  • 回收方法区:垃圾的定义
  • 如何回收垃圾
    • 垃圾回收算法总结
      • 标记—清除算法(适用老年代,但是基本废弃了)
      • 标记—复制算法(现在新生代普遍用的)
      • 标记—整理算法(现在老年代普遍用的)
  • JVM GC的种类
    • GC的触发机制
      • 年轻代GC(Minor GC)触发机制
      • 老年代GC(Major GC/Full GC)触发机制
      • Full GC触发机制
    • 为什么需要把Java堆分代?
  • JVM中一次完整的GC流程是怎样的?
  • JVM GC注意点:
    • Full GC会导致什么?
    • JVM什么时候触发GC?
    • 如何减少FullGC的次数?
    • 为什么老年代不能使用标记复制?
    • 新生代为什么要分为Eden和Survivor?
    • 为什么要设置两个Survivor区域?
    • 为什么新生代和老年代要采用不同的回收算法?

首先我们要知道哪些内存需要被回收?

哪些内存需要回收

在Java内存运行时区域的各个部分中,堆和方法区这两个区域则有着很显著的不确定性:一个接口的多个实现类需要的内存可能会不一样,一个方法所执行的不同条件分支所需要的内存也可能不一样,只有处于运行期间,我们才能知道程序究竟会创建哪些对象,创建多少个对象,这部分内存的分配和回收是动态的。

垃圾收集器所关注的正是堆和方法区的内存该如何管理的问题,我们平时所说的内存分配与回收也仅仅特指这一部分内存

回收堆:垃圾的定义

引用计数算法:

在对象中添加一个引用计数器:

  • 每当有一个地方引用它时,计数器值就加一;
  • 当引用失效时,计数器值就减一;

任何时刻计数器为零的对象就是不可能再被使用的

但是,在Java领域,至少主流的Java虚拟机里面都没有选用引用计数算法来管理内存,主要原因是,这个看似简单的算法有很多例外情况要考虑,必须要配合大量额外处理才能保证正确地工作,

你可能感兴趣的:(#,JVM,Java面试知识点精讲,java,jvm,算法)