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
-
-