JVM基础01-基础知识概括

JDK8官方地址:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/toc.html

1. Java 执行流程

1.1 类的初始化过程

1.2 类加载器

双亲委派机制

就是如果一个类加载器收到了类加载请求,

它首先不会自己尝试去加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,

因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有父类加载器反馈到无法完成这个加载请求(它的搜索范围没有找到这个类),子加载器才会尝试自己去加载

1.3 运行时数据区

    Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。其中一些数据区域是在Java虚拟机启动时创建的,仅在Java虚拟机退出时才被销毁。其他数据区域是每个线程的。在创建线程时创建每个线程的数据区域,在线程退出时销毁每个数据区域。

2 垃圾回收器GC(主要是对堆和方法区内存回收)

  • MinorGC: 也叫Young GC,指的是新生代 GC,发生在新生代的垃圾回收。 Minor GC 通常很频繁,一般回收速度也很快

  • MajorGC: 老年代的 GC,发生在老年代的垃圾回收,该区域的对象存活时间比较长,通常来讲,发生 Major GC时,会伴随着一次 Minor GC,而 Major GC 的速度一般会比 Minor GC 慢10倍。

  • FullGC: 指的是全区域(整个堆)的垃圾回收,通常来说和 Major GC 是等价的。

  

2.1 垃圾回收过程

1.判断对象是否死亡

  • 引用计数算法:给每一个创建的对象增加一个引用计数器,每当有一个地方引用它时,这个计数器就加1;而当引用失效时,这个计数器就减1。当这个引用器的数组为0时,说明没有对象使用它,那么这是一个无效的对象。

    • 这种算法无法解决对象之间循环引用的问题。因此无法用它来进行垃圾回收;
  • 可达性算法(根搜索算法):概念是:从GC Roots节点(起始点)出发向下搜索,如果没有任何引用链相连(即GC Roots到对象不可达),则证明此对象不可用。

    • 可以作为GC Roots节点的是:

      • 虚拟机栈(栈帧中的本地变量表)中引用的对象

      • 方法区中的静态变量属性引用的对象

      • 方法区中常量引用的对象

      • 本地方法栈中(JNI)(即一般说的Native方法)的引用的对象

    • 缺点:

      • 相对比较耗时;

2.垃圾回收过程

  • 1.新生成的对象存入到Eden;

  • 2.当Eden存满之后,MinorGC对Eden进行清理,存活下来的对象存储到SO区域;

  • 3.新生的对象继续存入Eden;

  • 4.当Eden再次存满时,再次进行清理,将Eden剩余存货的对象和S0剩余的对象,移到S1中;

  • 5.重复以上的步骤。并记录对象的年龄。当年龄到达阈值后,移动到老年代;

  • 6.重复将达到阈值的年轻代对象移动到老年代;

  • 7.直到老年代内存不够,进行MinorGC,进行标记和整理压缩;一般MajorGC会同时触发FullGC;

2.2 垃圾回收算法

  • 标记清理算法:可达性标记出需要清理的对象,然后再用清理算法进行清理;

    • 容易产生内存碎片

    • 标记和清理计算,效率比较低;

  • 复制算法:进行对象清理,将存活的对象复制到另一块内存;

    • 优点:避免碎片化

    • 缺点:内存浪费,将内存一分为二

  • 标记-整理算法:先标记出所有存活的对象,然后让所有存活对象向一端进行移动,最后直接清理到端边界以外的内存

    • 优点:避免内存浪费

    • 缺点: 移动操作频繁,效率较低

  • 分代收集算法:将堆内存进行分区,分成新生代,老生代。

    • 对新生代的内存,采用复制算法;

    • 对老生代的内存,使用清除-整理算法

3.JVM常见参数

  • xms:堆的初始内存大小;

  • xmx:堆的最大内存大小;

  • xx:NewRatio:设置年轻代和老年代的比值;

  • xx:NewSize:设置年轻代大小;

  • XX:PermSize:永久代初始值;

  • GC收集器选择

    • XX:+UseSerialGC:设置串行收集器

    • XX:+UseParallelGC:设置并行收集器

    • XX:+UseParalledlOldGC:设置并行年老代收集器

    • XX:+UseConcMarkSweepGC:设置并发收集器

  • GC 打印

    • XX:+PrintGCDetails

    • XX:+PrintGCTimeStamps

posted @ 2020-08-24 09:59  PerfectLi  阅读(145)  评论(0)    收藏  举报