跳至主要內容

Jvm总览

Durant...大约 14 分钟jvmJvm

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