面试--JVM篇
Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境)
JVM有哪些部分组成,运行流程是什么?
JVM组成
什么是程序计数器?
程序计数器:线程私有的,内存保存字节码的行号。用于记录正在执行的字节码指令的地址
详细介绍java堆?
线程共享的区域
主要用来保存对象实例,数组等,当堆中没有内存空间可分配给实例,也无法在扩展时,则抛出OutOfMemoryError异常
java7和java8的jvm内存结构区别
你能给我详细介绍java堆吗?
什么是虚拟机栈?
Java Virtual machine Stacks(java虚拟机栈)
- 每个线程运行时所需要的内存,称为虚拟机栈,先进后出
- 每个栈有多个栈帧(frame)组成,对应着每次方法调用时所占用的内存
- 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
垃圾回收是否涉及栈内存?
垃圾回收主要指堆内存,当栈帧弹栈以后,内存就会释放
栈内存分配越大越好吗?
未必,默认的栈内存通常为1024k
栈帧过大会导致线程数变少,例如,机器总内存512m,目前能活动的线程数则为512个,如果把栈内存改为2048k,那么能活动的栈帧就会减半
方法内的局部变量是否是线程安全的
栈内存溢出情况
- 栈帧过多导致栈内存溢出,典型问题:递归调用
- 栈帧过大导致栈内存溢出
解释一下方法区?
- 方法区(Method area)是各个线程共享的内存区域
- 主要存储类的信息、运行时常量池
- 虚拟机启动的时候创建,关闭虚拟机时释放
- 如果方法区域中的内存无法满足分配请求,则会抛出OutOfMemoryError:Metaspace
常量池
一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型以及字面量等信息
运行时常量池
常量池是*.class文件中的,当该类被加载,它的常量信息就会放入运行时常量池,并把里面的符号地址变为真实内存地址
解释一下方法区?
介绍一下运行时常量池
你听过直接内存吗?
直接缓存:并不属于JVM中的内存结构,不由JVM管理。虚拟机的系统内存,常见于NIO操作时,用于数据缓冲区,他分配回收成本较高,但读写性能高
常规IO
NIO
你听过直接内存吗?
类加载器
什么是类加载器,类加载器有哪些?
类加载器:JVM只会运行二进制文件,类加载器的作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来
1、什么是类加载器?
2、类加载器有哪些
什么是双亲委派模型?
加载某一个类,先委托上一级的加载器进行加载,如果上级加载器也有上级,则会继续向上委托,如果该类委托上级没有被记载,子加载器尝试加载该类
为什么采用双亲委派机制?
什么是双亲委派模型?
JVM为什么采用双亲委派机制?
类装载的执行过程说一下?
加载
前两句话就是元空间中存储类的信息,最后一句话在堆中创建对象
验证
准备
为类变量(static 静态变量)分配内存并设置类变量初始值
解析
将类中的符号引用转换为直接引用
比如:方法中调用了其他方法,方法名可以理解为符号引用,而直接引用就是使用指针直接指向方法
初始化
对类中的静态变量,静态代码块进行初始化操作
- 如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类
- 如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行
使用
说一下类装载的执行过程?
垃圾回收
对象什么时候可以被垃圾回收器回收
如果一个或多个对象没有任何引用指向它,那么这个对象就是垃圾,如果定位了垃圾,则有可能被垃圾回收器回收
如果要定位什么是垃圾,有两种方式来确定,第一个是引用计数法,第二个是可达性分析算法
引用计数法
可能存在问题
可达性分析算法
哪些对象可以作为GC Root?
对象什么时候会被垃圾器回收?
JVM垃圾回收算法有哪些?
标记清除算法
标记整理算法
复制算法
JVM垃圾回收算法有哪些?
JVM中的分代回收?
分代收集算法
MinorGC 和MixedGC以及FullGC的区别是什么
说一下JVM中的分代回收
>
MinorGC 和MixedGC以及FullGC的区别是什么?
说一下JVM有哪些垃圾回收器?
串行垃圾收集器
并行垃圾收集器
CMS(并发)垃圾收集器
G1垃圾收集器
说一下JVM有哪些垃圾回收器?
详细聊一下G1垃圾回收器?
Young Collection(年轻代垃圾回收)
Concurrent Mark(并发标记)
当老年代占用内存超过阈值(默认是45%)后,触发并发标记,这时无需暂停用户线程
标记老年代中依旧存活的内存对象
混合垃圾回收(Mixed Collection)
到达一定阈值的幸存者区和回收价值比较高的老年代放到新的老年代中
复制完成,内存得到释放。进入下一轮的新生代回收、并发标记、混合收集里
聊一下G1垃圾回收器?
强引用、软引用、弱引用、虚引用的区别
区别?
JVM实践
JVM调优的参数可以在哪里设置?
war包部署在tomcat中设置
jar包部署在启动参数设置
通常在linux系统中直接加参数启动springboot项目
jvm调优的参数可以在那里设置
JVM调优的参数有哪些?
对于JVM调优,主要就是调整年轻代、老年代、元空间的内存空间大小以及使用的垃圾回收器类型
设置堆空间大小
虚拟机栈的设置
年轻代中Eden区和两个survivor区的大小比例
年轻代晋升老年代的阈值
设置垃圾回收收集器
JVM调优的参数有哪些?
说一下JVM调优的工具?
Jmap
Jstat
Java内存泄漏的排查思路?
三种情况:
步骤
java内存泄漏的排查思路?
CPU飙高的排查方案与思路?
通过以上分析,在进程40940中的线程40950占用CPU较高
排查思路?