JVM/GC

作者: wang_souris | 来源:发表于2020-04-12 22:43 被阅读0次

    JVM

    JVM的主要组成

    image.png

    JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。

    Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)来装载class文件到Runtime data area中的method area。

    • Execution engine(执行引擎):执行classes中的指令。

    • Native Interface(本地接口):与native libraries交互,是其它编程语言交互的接口。

    • Runtime data area(运行时数据区域):这就是我们常说的JVM的内存。

    作用 :首先通过编译器把 Java 代码转换成字节码,类加载器(ClassLoader)再把字节码加载到内存中,将其放在运行时数据区(Runtime data area)的方法区内,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。

    GC

    怎么判断对象可以被回收

    • java语言中没有使用引用计数法来管理内存,其中最主要的原因是它很难解决对象之间相互循环引用的问题。

    • 可达性分析算法:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是可以被回收的。(从GC Roots 到这个对象不可达时,证明此对象是不可用的)

    在 java 中可以作为 GC Roots的对象有以下几种:

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

    • 方法区类静态属性引用的对象

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

    • 本地方法栈 JNI (Native方法)引用的对象

    垃圾收集算法

    • 标记-清除

    • 复制

    • 标记-整理

    • 分代收集算法

    垃圾收集器

    • Serial收集器(复制算法): 新生代单线程收集器,标记和清理都是单线程,优点是简单高效

    • ParNew收集器 (复制算法): 新生代收并行集器,实际上是Serial收集器的多线程版本,在多核CPU环境下有着比Serial更好的表现;

    • Parallel Scavenge收集器 复制算法): 新生代并行收集器,追求高吞吐量,高效利用 CPU。吞吐量 = 用户线程时间/(用户线程时间+GC线程时间),高吞吐量可以高效率的利用CPU时间,尽快完成程序的运算任务,适合后台应用等对交互相应要求不高的场景;

    • Serial Old收集器 (标记-整理算法): 老年代单线程收集器,Serial收集器的老年代版本; Parallel Old收集器 (标记-整理算法): 老年代并行收集器,吞吐量优先,Parallel Scavenge收集器的老年代版本;

    • CMS(Concurrent Mark Sweep)收集器(标记-清除算法): 老年代并行收集器,以获取最短回收停顿时间为目标的收集器,具有高并发、低停顿的特点,追求最短GC回收停顿时间。

    • G1(Garbage First)收集器 (标记-整理算法): Java堆并行收集器,G1收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代),而前六种收集器回收的范围仅限于新生代或老年代。

    相关文章

      网友评论

        本文标题:JVM/GC

        本文链接:https://www.haomeiwen.com/subject/kcvimhtx.html