其他分享
首页 > 其他分享> > jvm

jvm

作者:互联网

JVM虚拟机

  1. JVM的位置

    image-20220426164745687

  2. JVM的体系结构

    image-20220426165241344

  3. 类加载器

    image-20220427142629416

    • 虚拟机自带的加载器

    • 启动类(根)加载器

    • 扩展类加载器

    • 应用(系统类)程序加载器

  4. Native

    //native:凡是带了native关键字的,说明java的作用范围达不到,会去调用底层c语言的库
    //会进入本地方法栈
    //调用本地方法本地接口 JNI接口
    //JNI:扩展java 的使用,融合不同的编程语言为java使用,最初是:c c++
    //java诞生的时候c,c++横行,想要立足,必须要有调用c c++的程序
    //它在内存区域中专门开辟了一块标记区域:native method stack
    //在最终执行的时候,加载本地方法库中的方法通过JNI接口
    //调用其他接口:
    
  5. 方法区

    • 静态变量、常量、类信息(构造方法,接口定义)、运行时的常量池存在方法区中,但是实例遍历存在堆内存中和方法区无关(static、final、class、常量池)
  6. 栈:数据结构

    • 程序= 数据结构+算法

    • 先进后出,后进先出

    • 队列:先进先出(FIFO:First Input First Output)

    • main()先执行,最后结束

    • 栈内存,主管程序的运行,生命周期和线程同步。线程结束,栈内存也就是释放,对于栈来说,不存在垃圾回收问题。一旦线程结束,栈就over

    • 存储8大基本类型 + 对象引用 + 实例的方法

    • 栈满了:抛出stackoverflowerror

  7. Heap:一个JVM只有一个堆内存,堆内存的大小是可以调节的

    类加载器读取类文件后。会把:常量、类、方法、变量,保存所有引用类型的真实数据

    堆内存分为三个区:

    • 新生区(伊甸园区) Young
      • 类:诞生和成长的地方,或者死亡
      • 所有的对象都是在伊甸园区new出来的
      • 幸存者(0、1)
    • 养老区 Old :当一个对象经历了15次GC后,就会进入养老区
    • 永久区

    GC 垃圾回收,主要是在伊甸园区和养老区

    OOM:堆内存不够 outofmemory

    JDK8以后:养老区 = 元空间

    99%的对象都是临时对象

  8. 永久区

    • 这个区域常驻内存,用来存放JDK的Class对象,interface元数据,存储的是Java运行时的环境或类信息,不存在垃圾回收,关闭JVM就会释放
  9. GC常用算法

    • 引用算法

      image-20220428214007344

    • 复制算法

      谁空谁是to

      image-20220428212822280

      • 好处:没有内存的碎片
      • 坏处:浪费了内存空间,对一般空间永远是空to区,假设对象100%存活
      • 复制算法最佳使用场景:对象存活度比较低的时候-->新生区
    • 标记清除算法

      image-20220428213344636

      • 优点:不需要额外的空间

      • 缺点:两次扫描,严重浪费时间,会产生内存碎片

    • 标记压缩算法

      image-20220428215201252

    • 标记清除压缩算法

      先标记几次

      image-20220428215300353

      再压缩

image-20220428215407177

总结

标签:JVM,标记,算法,内存,jvm,压缩算法,加载
来源: https://www.cnblogs.com/lobort/p/16265176.html