JVM思维导图分享(包含详细知识点)

 思维导图地址:

3-1JVM 思维导图,点此跳转

思维导图内容如下:

JVM  

  • JVM整体结构
    • JDK体系结构
    • JVM整体结构及内存模型
    • JVM内存参数设置
      • -Xss:每个线程的栈大小
      • -Xms:设置堆的初始可用大小,默认物理内存的1/64
      • -Xms:设置堆的初始可用大小,默认物理内存的1/64
      • -Xmn:新生代大小
      • -XX:NewRatio:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。
      • -XX:SurvivorRatio:默认8表示一个survivor区占用1/8的Eden内存,即1/10的新生代内存。
      • -XX:MaxMetaspaceSize: 设置元空间最大值, 默认是-1, 即不限制,建议1/32物理内存
      • -XX:MetaspaceSize: 指定元空间触发Fullgc的初始阈值(元空间无固定初始大小), 以字节为单位,默认是21M左右,达到该值就会触发full gc进行类型卸载, 同时收集器会对该值进行调整: 如果释放了大量的空间。建议1/32物理内存
    • 日均百万级订单交易系统如何设置JVM参数
    • 设置内存参数的目的:尽可能让对象都在新生代里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁的进行垃圾回收
  • JIT
    • 解释执行C1:指令会按照字节码内容顺序解释执行
    • 即时编译器:C2与Graal
      • 热点代码:被频繁调用的代码
      • 热点探测
        • 方法调用计数器:服务端模式下是 10000 次调用后,认为是热点代码
        • 回边计数器:在服务端模式下是10700
      • 编译优化技术
        • 方法内联:把目标方法的代码复制到发起调用的方法之中,避免发生真实的方法调用。                经常执行的方法,默认情况下,方法体大小小于 325 字节的都会进行内联
        • 锁消除:变量的读写肯定不会有竞争,这个时候 JIT 编译会对这个对象的方法锁进行锁消除
        • 逃逸分析(实现栈上分配)
        • 标量替换:如果这个对象可以被拆分的话,当程序真正执行的时候可能不创建这个对象,而直接创建它的成员变量来代替。将对象拆分后,可以分配对象的成员变量在栈或寄存器上,原本的对象就无需分配内存空间了
          • 线程
          • 方法
  • 类加载
    • Java命令执行代码的大体流程
    • loadClass的类加载过程
      • 加载:在硬盘上查找并通过IO读入字节码文件,使用到类时才会加载,例如调用类的main()方法,new对象等等,在加载阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
      • 验证:校验字节码文件的正确性
      • 准备:给类的静态变量分配内存,并赋予默认值
      • 解析:将符号引用替换为直接引用,该阶段会把一些静态方法(符号引用,比如main()方法)替换为指向数据所存内存的指针或句柄等(直接引用),这是所谓的静态链接过程
      • 初始化:对类的静态变量初始化为指定的值,执行静态代码块
    • 类被加载到方法区的主要内容
    • 注意:
    • 主类在运行过程中如果使用到其它类,会逐步加载这些类。
    • jar包或war包里的类不是一次性全部加载的,是使用到时才加载。
      • 运行时常量池
      • 类型信息
      • 字段信息
      • 方法信息
      • 类加载器的引用:个类到类加载器实例的引用
      • 对应class实例的引用:类加载器在加载类信息放到方法区中后,会创建一个对应的Class 类型的对象实例放到堆中, 作为开发人员访问方法区中类定义的入口
    • 类加载器
      • 引导类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,比如rt.jar、charsets.jar等
      • 扩展类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR类包
      • 应用程序类加载器:负责加载ClassPath路径下的类包,主要就是加载你自己写的那些类
      • 自定义加载器:负责加载用户自定义路径下的类包
    • 双亲委派机制
      • 为什么要设计双亲委派机制
        • 沙箱安全机制:自己写的java.lang.String.class类不会被加载,这样便可以防止核心API库被随意篡改
        • 避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次,保证被加载类的唯一性
      • 双亲委派机制:,先找父亲加载,不行再由儿子自己加载
    • 全盘负责委托机制:当一个ClassLoder装载一个类时,除非显示的使用另外一个ClassLoder,该类所依赖及引用的类也由这个ClassLoder载入。
    • 自定义类加载器:java.lang.ClassLoader 类,重写findClass方法
    • Tomcat自定义加载器
      • 打破双亲委派机制的原因
        • 一个web容器可能需要部署两个应用程序,不同的应用程序可能会依赖同一个第三方类库的不同版本,保证相互隔离
        • 部署在同一个web容器中相同的类库相同的版本可以共享。
        • web容器也有自己依赖的类库,不能与应用程序的类库混淆。
        • web容器需要支持 jsp 修改后不用重启
      • Tomcat自定义加载器详解
      • tomcat主要类加载器
        • commonLoader:Tomcat最基本的类加载器,加载路径中的class可以被Tomcat容器本身以及各个Webapp访问;
        • catalinaLoader:Tomcat容器私有的类加载器,加载路径中的class对于Webapp不可见;
        • sharedLoader:各个Webapp共享的类加载器,加载路径中的class对于所有Webapp可见,但是对于Tomcat容器不可见;
        • WebappClassLoader(打破了双亲委派机制):各个Webapp私有的类加载器,加载路径中的class只对当前Webapp可见,实现war包相互隔离
  • JVM对象创建与内存分配机制
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值