• 初探JVM总结


    1. 什么是JVM

      • Java Virtual Machine(Java虚拟机)的缩写 。本质上是一个程序。

      • java语言运行的平台,是ava跨平台的根本。

    2. java默认的三种类加载器

      • BootStrap ClassLoader:启动类加载器

        负责加载java核心包也就是rt.jar里面的所有Class。该加载器由C++实现

      • ExtClassLoader:扩展类加载器

        负责加载java平台扩展的一些包,主要是libext目录下的一些jar包

      • AppClassLoader:应用类加载器

        负责加载classpath中指定的jar以及目录中的class

        classpath:存放各种配置资源文件,存放模板文件,存放java文件编译后的class文件……

         

    3. 双亲委派机制

      • 当AppClassLoader或ExtClassLoader加载到一个class是,它首先把这个类委托给BootStrap ClassLoader去加载完成

      • 如果 BootStrap ClassLoader 加载失败,会使用 ExtClassLoader 来尝试加载

      • 如果 ExtClassLoader 也加载失败,会尝试使用 AppClassLoader 来尝试加载

      • 如果 AppClassLoader 也加载失败,则会报出 ClassNotFoundException 异常

        好处: 防止内存中出现多份同样的字节码(安全性角度)

        注意: 类加载器在成功加载某个类之后,会把得到的类的实例缓存起来。下次再请求加载该类的时 候,类加载器会直接使用缓存的类的实例,而不会尝试再次加载。

    4. JVM中的栈

      • 栈的存取顺序是先进后出,后进先出

      • 栈在线程被创建的同时被创建,每个线程有一个私有栈

      • 栈由许多帧组成,叫栈帧,

      • 每次调用方法都会创建一个新的栈帧,用来存储这个方法的数据

      • 栈帧的大小各不相同,取决于方法的参数、局部变量和算法

      • 当一个方法被执行时,程序只能访问当前栈帧的数据,你能看到的只有栈顶的帧

      • 当前方法结束执行(抛出异常终止或是正常return结束), 当前栈帧会弹出java栈

      • Java帧上的所有数据都是此线程私有的 ,任何线程都不能访问另一个线程的数据

    5. JVM中的堆

      • java堆内存分为堆内存和非堆内存,堆内存分为年轻代( Young Generation ) 、老年代(Old Generation),非堆内存就一个永久代(Permanent Generation)。

      • 年轻代又分为伊甸园区(Eden space)和幸存区(Survivor)。Survivor区由FromSpace和ToSpace组成。Eden区占大容量,Survivor两个区占小容量,默认比例是8:1:1。

      • 堆内存用途:存放的是对象,垃圾收集器就是收集这些对象,然后根据GC算法回收。

      • 堆内存用途:永久代,也称为方法区,存储程序运行时长期存活的对象,比如类的元数据、方法、常量、属性等。 当GC回收一定次数后还没有清除的对象,就会到永久代

      • 在JDK1.8版本废弃了永久代,替代的是元空间(MetaSpace),元空间与永久代上类似,都是方法区的实现,他们最大区别是:元空间并不在JVM中,而是使用本地内存。

    6. GC和Full GC

      • GC回收新生代

      • Full GC回收新生代,老年代,元空间

    1. GC垃圾回收算法

      • 复制算法

        • 将内存空间分为两块相同的存储空间,每次只使用一块,GC时,将正在使用的内存中的存活对象复制到另一块存储空间中,然后清除正在使用的空间的所有对象 ,适合幸存区

        • 优点: 存活对象相对少时,效率很高

        • 缺点:浪费了内存空间,假设对象100%存活,多了一半空间永远是to

      • 引用计数法

        • 每一个对象都有一个counter,只要有任何一个对象引用了该对象,则其counter加1

        • 当引用失效时,counter减1,当counter为0时,对象不存在任何引用,在GC时被清除

        • java虚拟机未采用引用计数法GC

      • 标记清除法

        • 标记所有的可达对象(存在引用的对象),则未被标记的对象就是不存在引用的垃圾对象,GC时清除所有未被标记的对象

        • 标记清除法的GC时经历标记 + 清除两个过程,先标记,后清除

        • 产生空间碎片

      • 标记压缩算法

        • 标记压缩法是对标记清除法的优化,所以也叫标记清除压缩法。和标记清除法一样,先标记所有的可达对象(存在引用的对象),不同的是,标记完成后并不是直接清除未标记的垃圾对象,而是将所有的被标记的对象(即存活对象)压缩到内存空间的一端后在清理边界外所有的空间。

        • 分为标记-压缩-清除三个步骤

      总结

      内存效率:复制算法 > 标记清除算法 > 标记压缩算法(时间复杂度)

      内存整齐度:复制算法=标记压缩算法 > 标记清除算法

      内存利用率:标记压缩算法 = 标记清除算法 > 复制算法

    1. GC分代算法

      • 将内存空间根据对象的特点不同进行划分,选择合适的垃圾回收算法,以提高垃圾回收的效率。

      • 老年代因为对象的存活率高(复制的代价就要高),也没有担保空间,所以采用标记清除/压缩法

      • 新生代采用复制算法

  • 相关阅读:
    HTML总结
    Java 基础知识总结 (三、运算符)
    关于JS 事件冒泡和onclick,click,on()事件触发顺序
    Java 基础知识总结 (四、String)
    Java 基础知识总结 (二、基本数据类型)
    websocket实例(显示文件导入处理进度)
    Java 基础知识总结 (一、标识符)
    Java Calendar 注意事项
    Ajax调用SpringMVC ModelAndView 无返回情况
    关于Ajax load页面中js部分$(function(){})的执行顺序
  • 原文地址:https://www.cnblogs.com/seekknowledge/p/11983777.html
Copyright © 2020-2023  润新知