JVM学习

JVM体系预览

image-20210902152852901

Class loader是否加载class文件,识别开头 cafe babe

image-20210902163158773

jre就是java run environment

灰色代表线程私有,内存占用很少;(不存在垃圾回收机制)

四种ClassLoader

image-20210902162308851 image-20210902164122286
双亲委派机制:
  • 一般去父类找已经编译好的,找不到再自己做;(沙箱安全机制)

Native Interface

image-20210902164409710

image-20210902165519962

PC Register寄存器

  • 每个线程的PCR指向下一个指令的指针
  • image-20210902170127712

Method Area 方法区

存储每个类的模板信息————绝对不是放方法的地方image-20210902171411560

image-20210902171754599

Stack

栈管内存,堆管存储;

  • 栈帧保存哪些东东?
    • 8中基本类型变量+对象的引用变量+实例方法
image-20210902173802047 image-20210902173626117 栈中储存的东西
Java.lang.StackOverflowError 栈内存溢出

栈堆和方法区的交互关系

image-20210903142507858

堆heap

image-20210903143020583
  • 新生代

    • YOUNY/NEW 8:1:1
    1. 伊甸园区

      image-20210903160020976
    2. 幸存者0区

    3. 幸存者1区

  • 老年代 Old/Tenure

  • 永久代/元空间 Perm

    • image-20210903154500064

逻辑上新生养老元空间,物理上只有新生+养老

image-20210903154731209 image-20210903153757676

Java8之后永久代和元空间的变化

image-20210903155348328

堆参数调优

实际生产中Xms 和 Xmx必须调成一样,防止

最大分配的物理内存和初始化的内存设置成一样大小,避免GC和应用程序争抢内存,峰值和峰谷忽高忽低

GC详细日志解读

image-20210903165929128

11个参数的意思

image-20210903172405616

image-20210903172135941

GC是什么

分代收集算法
次数上频繁收集Young区
次数上较少收集Old区
基本不动元空间

GC4大算法优缺点

  1. 引用计数法(一般不用)
    • image-20210903173817688
  2. 复制算法(copying)
    • 年轻代中
    • 不会产生内存碎片
    • 占用double内存
  3. 标记清除(Mark-Sweep)
    • 老年代
    • 两次扫描,耗时严重;不连续,会产生内存碎片
    • 不需要额外空间
  4. 标记压缩(Mark-Compact)
    • 老年代,耗时严重;
    • image-20210904141549770
    • 标记-清除-压缩

综合

小总结image-20210904141900014

image-20210904143900525

JMM——JAVA内存模型

  1. 原子性
  2. 可见性(通知机制)
    • volatile
  3. 有序性

cpu>内存>硬盘

内存关系

i think开发中比较重要的 static(只编译一次) > 构造方法块 > 构造方法

Others:

-------------本文结束感谢您的阅读-------------