应该明白的问题:
对jvm的理解?java8虚拟机和之前的变化更新?
什么是OOM,什么是栈溢出StackOverFlowError?具体分析?
JVM的常用调优参数有哪些?
内存快照如何抓取,怎么分析Dump文件?
谈谈JVM中,类加载器你的认识?
1. jvm的位置
运行在操作系统之上
2. jvm体系结构
3. 类加载器
作用:加载.class文件 ----》 1. 虚拟机自带的加载器 2. 启动类(根)加载器 3. 拓展类加载器(jdk1.8之后改为平台类加载器) 4. 应用程序加载器
4. 双亲委派机制
保证安全性能;APP–>EXC—>BOOT
当一个类加载器加载一个类时,会委托其父类来进行加载;
5. 沙箱安全机制
沙箱安全机制是一个限制程序运行的环境。沙箱机制将Java代码限定在虚拟机特定的运行范围内,并严格限制代码堆本地资源的访问。
6. Native
native:凡是带native关键字的,会去调用底层C/C++语言的库
//进入本地方法栈中,调用本地方法接口(java native interface)
//JNI作用 :拓展Java的使用,融合不同的编程语言为Java多用。
7. PC寄存器
每一个线程都有一个程序计数器,线程私有,指向方法区中的字节码,在执行引擎读取下一条指令。8. 方法区
方法区是被所有线程共享的存储已被加载的:静态变量,常量,类信息
9. 栈
栈内存:主管程序的运行,生命周期和线程同步;
线程结束,栈内存释放,栈中,不存在垃圾回收问题;
栈:基本类型+对象的引用+实例的方法
10. 三种jvm
11. 堆
GC垃圾回收,主要是在伊甸园区和养老区 假设内存满了,OOM,堆内存不够, 在jdk8之后,永久存储区改名(元空间)12. 新生区、老年区
13. 永久区
这个区域常驻内存,存放JDK自身携带的Class对象,Interface元数据,存储Java运行时的一些环境 * jdk1.6之前:永久代,常量池在方法区 * jdk1.7 :永久代,常量池在堆中 * jdk1.8 :无永久代,常量池在元空间14. 堆内存调优
项目中,出现OOM故障,怎么排除? 调整对内存大小 dump文件 分析 jprofile15. GC(垃圾回收)
JVM在进行GC时,并不是对三个区域统一进行回收。大部分时候,回收的时新生代 * 新生代 * 幸存区(from to) * 老年区 GC种类:轻GC , 重GC **GC题目:** * JVM的内存模型和分区,详细每个区放什么? * 对里面的分区有哪些?Eden,from,to,老年区? * GC算法?标记清楚算法,标记压缩,复制算法,引用计数器 * 轻GC和重GC分别用在什么时候?复制算法
坏处:浪费内存空间,一半的幸存区保持空 好处:没有内存碎片标记清除算法
* 优点:节省空间 * 缺点:两次扫描,浪费时间,产生内存碎片标记压缩算法 16. 总结
* 内存效率:复制算法 > 标记算法 >标记压缩 (时间复杂度) * 内存整齐度: 复制算法==标记压缩 > 标记清楚算法 * 内存利用率: 标记压缩算法= 标记清楚算法 > 腐殖酸算法 **年轻代** * 存活率低 * 复制算法 **老年代** * 区域大:存活率 * 标记清楚+标记压缩混合实现