Java内存模型与垃圾回收笔记

内存模型

  • 。 局部变量(基本类型)与对象引用;线程隔离。每个方法执行时会创建一个栈帧,存储局部变量等。
  • 堆。 对象实例;线程共享。
  • 方法区。类信息、常量(final)、静态变量、符号引用; 线程共享。
  • 程序计数器。记录当前线程执行字节码的行号;线程隔离。
  • 本地方法栈。native方法。

 

新建对象

  程序new一个对象时,首先看类是否加载到了内存,如果没有则需要通过执行一个类加载过程,之后在堆中创建一个对象。

类加载

  使用双亲委派模型来进行类加载。类加载器收到加载请求会委托给父类加载器,能够确保类的全局唯一性。

  1. 加载。类加载器根据类的全限定名读取二进制字节流到方法区,并生成一个Class对象,作为访问入口。
  2. 验证。格式验证、语义验证。
  3. 准备。为静态变量分配内存。
  4. 解析。符号引用转为直接引用。
  5. 初始化。

创建对象

  分配对象内存、变量赋默认值、执行初始化方法、在栈中创建对象引用并把对象指针赋给它。可能发生指令重排序。

 

内存分配

  1. 对象优先分配到新生代的Eden区,空间不足时进行minor gc。Eden区与survivor区的对象复制到另一个survivor区,然后回收Eden区。
  2. 长期存活的对象复制到老生代。
  3. 每次minor gc时检查老生代空间是否充足,不足执行full gc。

 

垃圾回收

垃圾判定

  引用计数(存在循环引用)、可达性分析(从多个root对象出发,不在引用链上的表示不可达)。

垃圾回收器

  • Serial

    单线程收集器,收集时用户线程会暂停。收集新生代用复制算法,收集老生代用标记整理算法。

  • CMS (Concurrent Mark Sweep)

    老生代收集器。使用标记清除算法,可以并发标记、并发清除,目标是最短停顿时间,提高响应速度。

    缺点是会产生内存碎片,导致频繁GC。

  • Parallel Scavenge

    新生代收集器。使用复制算法,优点是可控制吞吐量,适合后台运算、交互少的任务。

  • G1(Garbage First)

    收集新生代与老生代。将Java堆划分成多个区域,区域之间不一定连续,每个区域可能是eden、survivor、old或Humongous(大对象)。  通过全局并发标记统计每个区域的垃圾堆积情况,每次收集垃圾最多的区域,不需要扫描全堆,效率高。

    特性: 与应用程序并发执行

        不会产生内存碎片

        软实时,设置垃圾回收的限时,G1会尽量在时限内完成垃圾回收(不确保)

    GC模式:Young GC:eden区域达到最大阈值时,触发young gc,回收eden区与survivor区

          Mixed GC:回收young region和old region。

        

     

 

posted @ 2019-04-30 15:30  Uglthinx  阅读(198)  评论(0编辑  收藏  举报