JVM探究

JVM探究

  1. JVM的位置
    在这里插入图片描述

  2. JVM的体系结构

    1. 栈,本地方法栈,程序计数器不会有垃圾回收(栈如果有垃圾,会将整个程序堵住)

    2. 方法区以及堆产生垃圾

    3. JVM主要调堆

  3. 类加载器

    1. 作用:加载Class文件

    2. 实例化的对象,其名字在栈里面

    3. 在这里插入图片描述

    4. 虚拟机自带的加载器

    5. 启动类(根)加载器

    6. 扩展类加载器

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

  4. 双亲委派机制

    1. 最终执行的是根加载器
    2. App->EXc ->Boot
  5. 沙漏安全机制

  6. NAtive

    1. 凡是带了native关键字的,说明Java的作用范围达不到,会去调用底层c语言的库!
    2. 会进入本地方法栈
    3. 调用本地方法接口 JNI(Java Native Interface)
    4. JNI作用:扩展Java的使用,融合不同的编程语言为Java所用!
    5. 它在内存区域专门开辟了一块标记区域:Native Method Stack 登记native方法
    6. 在最终执行的时候,加载本地方法库中的方法通过JNI
    7. 或者硬件:Java程序驱动打印机,管理系统,Robot()类等
  7. pc寄存器

  8. 方法区

    1. Java对象在内存中实例化

      1. 最初代码执行时在这里插入图片描述

      2. 代码执行,类中的成员变量和方法会先进去到方法区代码执行,类中的成员变量和方法会先进去到方法区[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dPgYxVz8-1653494209896)(C:\Users\26738\AppData\Roaming\Typora\typora-user-images\image-20220520211340496.png)]

      3. 程序执行到main方法时,main方法会被压入到栈中程序执行到main方法时,main方法会被压入到栈中[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iy2wAgOV-1653494209897)(C:\Users\26738\AppData\Roaming\Typora\typora-user-images\image-20220520211856531.png)]

      4. 执行到Person person = new Person();会在栈中创建Person类的引用,会在堆中存放实例化的对象,然后将成员变量和成员方法压在实例中(都是取得成员变量和成员方法地址值)执行到Person person = new Person();会在栈中创建Person类的引用,会在堆中存放实例化的对象,然后将成员变量和成员方法压在实例中(都是取得成员变量和成员方法地址值)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qe9StGLJ-1653494209897)(C:\Users\26738\AppData\Roaming\Typora\typora-user-images\image-20220520213346072.png)]

      5. 接下来person对象进行赋值,person.name="小二";person.age=13;person.height=180.0;先在栈区找到person,然后根据地址值找到new Person()进行赋值操作[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xDoASnC5-1653494209898)(C:\Users\26738\AppData\Roaming\Typora\typora-user-images\image-20220521154847797.png)]

      6. 在方法体void()被调用完成后,就会立刻马上从栈内弹出(出栈) ;最后,在main()函数完成后,main()函数完成后也会出栈[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BlCDWIab-1653494209898)(C:\Users\26738\AppData\Roaming\Typora\typora-user-images\image-20220522143305635.png)]

  9. 三种Jvm

    1. sun公司
    2. BEA HRockit
    3. IBM J9 VM
    4. 我们学习的都是:HotSPot
    1. Heap,一个JVM只有一个堆内存,堆内存的大小是可以调节的
    2. 类加载器读取了类文件后,一般会把类,方法,常量,变量~,保存我们所引用类型的真实对象
    3. 堆内存还细分为三个区:
      1. 新生区 (伊甸园区) Young/New

      2. 养老区 Old

      3. 永久区 Perm

      4. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OcmxyWhV-1653494209899)(C:\Users\26738\AppData\Roaming\Typora\typora-user-images\image-20220522145315619.png)]

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

  10. 新生区,老生区

    1. 新生区:
      1. 类:诞生和成长的地方,甚至死亡
      2. 伊甸园区 所有的对象都在伊甸园区new出来的
      3. 幸存者区(0,1)
  11. 永久区

    1. 这个区域常驻内存。用来存放JDK自身携带的Class对象,Interface元数据,存储的是Java运行时一些环境或类信息,这个区域不存在垃圾回收!关闭JVM虚拟机就会释放这个区域的内存

    2. 一个启动类,加载了大量第三方jar包。tomocat部署了太多的应用,大量动态生成的反射类,不断的被加载,知道内存溢出(oom)

    3. jdk1.6之前 :永久代,常量池在方法区;

    4. jdk1.7 :永久代,但是 慢慢退化、去永久代,常量池在堆中

    5. jdk1.8之后 :无永久代,常量池在元空间

    6. oom的排错:默认情况下:分配的总内存是电脑内存的1/4,而初始化的内存:为电脑内存的1/64

      1. 1.尝试扩大堆内存看结果
      2. 分析内存,看一下哪个地方出现了问题(专业工具)
    7. -Xms1024m -Xmx2014m -XX:+PrintGCDetails //修改初始内存和最大内存 ,打印GC垃圾回收信息

    8. -Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError //打印Dump文件

    9. 元空间,逻辑上存在,物理上不存在

    10. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dSVVKvtO-1653494209899)(C:\Users\26738\AppData\Roaming\Typora\typora-user-images\image-20220523230724606.png)]

    11. 在一个项目中,突然出现了OOM故障,如何排除?

      1. 能够看到第几行代码出错:内存快照分析,MAT,Jprofiler
      2. Debug,一行一行代码分析
    12. MAT,Jprofiler作用

      1. 分析Dump内存文件,快速定位内存泄漏
      2. 获得堆中数据
      3. 获得大的对象
      4. ~
  12. 堆内存调优

  13. GC

  14. GC常用算法

  15. JMM

    1. JMM:(Java memory model的缩写)

    2. 作用:缓存一致性协议,用于定义数据读写的规则(遵守,找到这个规则)

    3. JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory)

    4. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1nDRTpLm-1653494209900)(C:\Users\26738\AppData\Roaming\Typora\typora-user-images\image-20220525232959461.png)]

    5. 解决共享对象可见性这个问题:volitale,synchronized

    6. 内存交互操作

      1. lock锁定
      2. unlock解锁
      3. read读取
      4. load载入
      5. use使用
      6. assign赋值
      7. store存储
      8. writer写入
    7. Java内存模型还规定了执行上述8种基本操作时必须满足如下规则:

      (1)不允许read和load、store和write操作之一单独出现(即不允许一个变量从主存读取了但是工作内存不接受,或者从工作内存发起会写了但是主存不接受的情况),以上两个操作必须按顺序执行,但没有保证必须连续执行,也就是说,(必须)read与load之间、store与write之间是可插入其他指令的。

      (2)不允许一个线程丢弃它的最近的assign操作,即变量在工作内存中改变了之后必须把该变化同步回主内存。

      (3)不允许一个线程无原因地(没有发生过任何assign操作)把数据从线程的工作内存同步回主内存中。

      (4)一个新的变量只能从主内存中“诞生”,不允许在工作内存中直接使用一个未被初始化(load或assign)的变量,换句话说就是对一个变量实施use和store操作之前,必须先执行过了assign和load操作。

      (5)一个变量在同一个时刻只允许一条线程对其执行lock操作,但lock操作可以被同一个条线程重复执行多次,多次执行lock后,只有执行相同次数的unlock操作,变量才会被解锁。

      (6)如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前,需要重新执行load或assign操作初始化变量的值。

      (7)如果一个变量实现没有被lock操作锁定,则不允许对它执行unlock操作,也不允许去unlock一个被其他线程锁定的变量。

      (8)对一个变量执行unlock操作之前,必须先把此变量同步回主内存(执行store和write操作)。

  16. GC垃圾回收器

    1. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LOIH2POQ-1653494209900)(C:\Users\26738\AppData\Roaming\Typora\typora-user-images\image-20220524153453047.png)]

    2. JVM在进行GC时,并不是对这三个区域统一回收,大部分的时候,回收都是新生代

      1. 新生区

      2. 幸存区(from ,to)

      3. 老年区

      4. GC两种类:轻GC(普通的GC),重GC(全局GC)

      5. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cqre66Dn-1653494209900)(C:\Users\26738\AppData\Roaming\Typora\typora-user-images\image-20220524154348987.png)]

      6. GC题目:

        1. JVM的内存模型和分区,详细到每个区放什么?

        2. 堆里面的分区有哪些?Eden,from,to,老年区,说说他们的特点

        3. 轻GC和重GC分别在什么时候发生?

        4. 引用计数法:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c20yLQ1j-1653494209901)(C:\Users\26738\AppData\Roaming\Typora\typora-user-images\image-20220524161358083.png)]

        5. 复制算法在这里插入图片描述

        6. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qPw3PS7z-1653494209903)(C:\Users\26738\AppData\Roaming\Typora\typora-user-images\image-20220524233324997.png)]

          1. 好处:没有内存的碎片
          2. 坏处:浪费了内存空间;多了一半空间永远是空to
        7. 复制算法最佳使用场景:对象存度较低的时候;新生区

        8. 标记清楚算法[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ju7fJcH6-1653494209903)(C:\Users\26738\AppData\Roaming\Typora\typora-user-images\image-20220524235107002.png)]

          1. 优点:不需要额外的空间!
          2. 缺点:两次扫描,严重浪费时间,会产生内存碎片
        9. 标记压缩[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gyrdRTQA-1653494209904)(C:\Users\26738\AppData\Roaming\Typora\typora-user-images\image-20220524235616547.png)]

        10. 标记清楚压缩

          1. 先标记在这里插入图片描述

          后清除一次:

          [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HIP3BThK-1653494209905)(C:\Users\26738\AppData\Roaming\Typora\typora-user-images\image-20220524235852140.png)]

    3. 常用算法

      1. 标记清除法,标记压缩,复制算法,引用计数器
  17. 总结

    1. 内存效率:复制算法>标记清楚算法>标记压缩算法(时间复杂度)
    2. 内存整齐度:复制算法=标记压缩算法>标记清楚算法
    3. 内存利用率:标记压缩算法=标记清楚算法>复制算法
    4. GC:分代收集算法
    5. 年轻代
      1. 存活率低
      2. 复制算法
    6. 老年代
      1. 区域大:存活率
      2. 标记清楚(内存碎片不是太多)+标记压缩混合 实现

缩算法(时间复杂度)
2. 内存整齐度:复制算法=标记压缩算法>标记清楚算法
3. 内存利用率:标记压缩算法=标记清楚算法>复制算法
4. GC:分代收集算法
5. 年轻代
1. 存活率低
2. 复制算法
6. 老年代
1. 区域大:存活率
2. 标记清楚(内存碎片不是太多)+标记压缩混合 实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值