Jvm简介
...大约 4 分钟
1、JVM内存分布(1.8)
1、内存模型
程序计数器:保存当前线程执行的字节码位置
堆:存放对象的实例,没有空间,会抛出OOM异常
栈、虚拟机栈:存放局部变量,动态链接,操作栈,方法出口等信息,调用方法都会创建栈
本地方法栈:和虚拟机栈基本相同,但是本地是指native方法
以下两个不在JVM虚拟机中
方法区:又称非堆区,存储类信息,常量,静态变量等数
本地内存:分为元空间和直接内存
元空间:1.7的永久代和1.8的元空间,是方法区的一种实现
2、GC
分代回收:年轻代,老年代,持久代
回收器:串行回收器,并行回收器ParallelGC(默认), CMS, G1, ZGC
GC调优调优参数:
[堆栈相关]: -Xms 初始堆大小;Xmx 最大堆大小;Xmn年轻代大小;Xss 每个线程堆栈大小;XX:NewSize 年轻代大小....
[垃圾收集器相关]: -XX:+UseParallelGC: 并行收集器; -XX:ParallelGCThreads=20 配置并行收集器的线程数
若满足一下条件,则GC一般不需要优化。
■ Minor GC执行时间不超过50ms;
■ Minor GC执行不频繁,大概10秒执行一次;
■ Full GC执行时间不到1s;
■ Full GC执行频率不算频繁,不低于10分钟1次。
GC的两种判定方法:
1、引用链法
2、引用计数法(对象被引用就+1,删除引用-1,但是无法解决相互引用的情况)
3.GC 的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?
CMS基于标记清除:先标记,再清除,效率不高,会产生碎片。
G1局部看,使用了复制算法:分为8:1的eden区和surviver,也就是YGC
G1基于标记整理:标记完毕后,让所有已存活的对象向一端移动。
4、新生代内存不够时发生MiniorGC,也叫YGC,JVM内存不够时发生FGC
5、jstack查看当前栈信息,jmap查看当前内存,jhat查看dump堆信息,mat
3、类加载
■ 双亲委派机制(自底向上检查是否已被加载,自上向下加载类)
■ Bootstrap类加载器 \lib目录下的类
■ Extension类加载器 \lib\ext下的类
■ AppLication类加载器 扫描包下的类
■ 自定义类加载器(不打破双亲委派重写findClass,无法被父类加载的都会在这里加载,打破双亲就重写findClass)
■ 类加载的过程:加载loading -- 链接Linking :(验证 - 准备 - 解析) -- 初始化
4、性能调优
jvm参数:看2
性能分析工具:MAT,JMC,jstack,Jstat
5、编译器优化
公共子表达式的消除
指令重排
内联
逃逸分析
栈上分配
同步消除
6、执行模式
解释模式
编译模式
混合模式
常见问题:
1、什么是指针碰撞? 堆内存中分配内存时指针挪动分配的方式。
2、什么是空闲列表?不是规整的内存分配方式, 虚拟机需要维护一个列表,记录内存可用,分配时在列表上找到空闲的内存。这种分配方式叫空闲列表。
3、什么是TLAB? java堆中预先分配的一下块内存,本地线程分配缓存。 -XX:UseTLAB
4、如何选择垃圾收集器?堆内存不是很大或者是单核的机器,选择串行收集器。参数:-XX:+UseSerialGC。其他场景用并行收集器。
如果应用对响应时间要求较高,想要较少的停顿,甚至1秒都会引起失败。那么ZGC, CMS, G1都是合理的。1.8默认的是并行收集器。
5、内存泄露和内存溢出
内存溢出OOM:已经没有内存空间分配了,调整堆区内存大小. for循环中用数组不断添加元素
内存泄漏memory leak:引用的对象不会被回收,可能导致内存泄漏
6、强弱软引用
平时使用 Object o = new O();就是强引用,用SoftRefrence,WeakRefrence, PhantomReference
7、如何判断一个对象是否存活?引用计数法和可达性算法(引用链法)
8、jps,jinfo
# 现在的环境变量
jinfo -sysprops pid
# 曾经的环境变量
jinfo -flags pid 或者 jinfo -flags *** pid : ***表示参数
Powered by Waline v2.15.8