JVM1.0

jvm在JDK里面

JVM只认识class文件,所以 自己写的源码文件需要编译成class文件以后 才能被jvm识别

JVM的作用:用来运行class文件的

java:write once. Run anywhere (不同的平台有idk jdk只认识java class文件)

JVM:

内存溢出 、回收出现问题

HotSpot JVM 结构:

javaC编译器:

输入:java文件。输出:class文件

class文件格式:

u4—>magic

class文件到位-》类加载机制(装载-〉链接-》初始化)—〉

双亲委派:避免一个类 重复去加载。保证了安全比如定义了String类 会加载bootstrap中的String类 不会加载自己的类

一个类会先找他的父类加载器去加载,如果找不到,会找他的子类;

方法区:

运行时常量池:在内存中 ,是常量池的内存状态

常量池:在磁盘中 (类的名称 修饰 方法的名称等)

堆内存:类的实例信息。对象放在堆中

jvm内存模型:主要是方法区和堆。 线程共享的区域 (堆分成了old区域 和新生代(eden区域 s0、s1区域))

调优原则:尽量减少调优次数

eden区域往s1和s0中送,如果s区不够大,会往老年代进行空间担保进行借区域,新生呆到15以后 到老年代

大对象太大 直接放到老年代

JVM2.0

线程共享:方法区 堆内存

线程独享:pc 虚拟机栈 本地方法栈

输入—->(jvm)——>0101这样的字节码

垃圾收集器:

对堆内存的回收;

判断对象是不是需要回收?(什么样的对象被称做垃圾?)

—引用计数法 判断对象是不是被引用

—可达性分析

从GC Root进行扫描 判断该对象是不是可达的

—局部变量表中的变量、static成员变量【方法区】、常量引用、本地方法栈中的变量、Thread、类加载器等

回收

1-标记-清除算法

  • 三色法找出标记垃圾还是非垃圾对象 把垃圾对象空间进行释放

  • 缺点:容易产生空间碎片

    2-标记-整理算法

  • 解决空间碎片问题,但是耗时花费时间去整理

    3-标记-复制算法

  • 浪费一部分空间,解决空间碎片的问题 一份为二 一部分使用 一部分不使用

  • 把存活的对象放到(保留区)一边去,另一边直接清除掉

  • 存活的对象不能太多。否则不划算(很多就用标记清除或者标记整理)

垃圾收集器对垃圾收集算法做了实现,只需要选择对应的收集器即可;

  • Serial Collector:

    • 单线程。单核cpu 适合于内存小的场景

    • 使用jvm参数:-XX:+UseSerialGC

      • young gc:serial gc. 适用于young 区 (大多数对象是“不会存活太久的”) 标记复制

      • old gc:serial old: 标记整理或者清除(因为存活的时间长)

  • Paraller Collector:

    • 多核cpu

    • 和serial 很像 不过是多个垃圾收集线程一块工作。

    • 参数:-XX:+UseParallerGC

  • 当上述的Serial 和Paraller执行的时候 会暂停业务代码的执行 给用户的体验是响应时间比较长

  • 并行类的收集器:多个垃圾收集线程共同执行

  • 并发类的收集器:业务代码线程和垃圾收集线程共同执行

  • CMS-并发类收集器

  • 初始标记(标记可从GC ROOT出发直接到达的对象)-》并发标记(并发执行)(GCROOT出发间接到达的对象)-〉重新标记(防止过程中创建了新的对象)-》并发清理(并发执行)

  • 适用于老年代。 标记清除。会有碎片。低停顿处理器

  • 如果使用的cms,自动搭配新生代的parallel收集器

  • -XX:+UseConcMarkMultiple

  • Garbage First:

  • -XX:+UseG1GC. 并发类收集器。获取更小的停顿时间 比cms更小

  • 可设置停顿时间的目标 比如200毫秒

  • 解决空间碎片的问题。--标记整理算法

  • 筛选回收:筛选哪些region中的 可以选择 垃圾优先回收垃圾比较多的区域 以便于释放更多的垃圾

  • 既适用于新生代也适用于老年代

  • ZGC:

    • 停顿时间更低

    • 吞吐量好的选parallel 停顿的体验更短用G1或者ZGC

  • 判断标准;

    • 吞吐量

    • 停顿时间(响应时间)

    • 追求低停顿 高吞吐

      • 借助工具

  • GraalVM

  • 远程调用;

    • dubbo http openfeign

  • 异步调用:

    • Kafka mq

  • 性能优化:jvm 6节课+mysql6节课=24h

  • 源码:spring+mybatis 12+4=32h

  • 分布式组件:

    • spring cloud alibaba

    • 设计模式23

    • 软件设计原则 7大

    • 数据结构与算法

  • jvm:广度和深度到底要学到什么程度

JVM3.0

  • -X、-XX【使用的比较多】:非标准的。容易随着jdk的版本变化

  • -version -help。标准的。 不会发生变化

  • 查看java进程:

    • jsp -l

  • Jinfo -help

  • Info -flag

  • -XX:+PrintFlagsFinal

  • Jms查看java垃圾收集器以及线程

  • -XX:PretenureSizeThread=data. eden超过data后 就直接放入老年代

  • jps:查看java进程

  • jstack:JAVA进程中线程的情况

  • jps -l

  • Map:查看堆的情况在内存中

jvm:工具

阿里的arthas

jconsole

  • 内存相关的工具

    • oom排查:

      • MAT heather.io perfume

  • gc相关工具

    • 获取gc日志文件

    • 然后用工具帮你分析

    • 吞吐量和停顿时间

      • Gcviwer greasy.io gcplot等

垃圾回收调优的原则?

  • 尽可能不要进行垃圾收集

  • 非要进行垃圾收集,尽可能使用young GC

    • 原因:

      • old GC时间比较长 标记整理 标记清除。如果old GC回收不掉 就会出发OOM

    • 何时会发生young GC:

      • Eden 不够用了 S区不够了

    • 不管是young GC还是young GC 都会停顿

      • old gc=oldGC+youngGC

      • oldGC=majorGC

      • fullGC=oldGC+youngGC+metaspaceGC

05-15 03:12