JVM学习笔记
应该明白的问题:
对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文件 分析 jprofile
15. GC(垃圾回收)
JVM在进行GC时,并不是对三个区域统一进行回收。大部分时候,回收的时新生代
* 新生代
* 幸存区(from to)
* 老年区
GC种类:轻GC , 重GC
**GC题目:**
* JVM的内存模型和分区,详细每个区放什么?
* 对里面的分区有哪些?Eden,from,to,老年区?
* GC算法?标记清楚算法,标记压缩,复制算法,引用计数器
* 轻GC和重GC分别用在什么时候?
复制算法
坏处:浪费内存空间,一半的幸存区保持空
好处:没有内存碎片
标记清除算法
* 优点:节省空间
* 缺点:两次扫描,浪费时间,产生内存碎片
标记压缩算法
16. 总结
* 内存效率:复制算法 > 标记算法 >标记压缩 (时间复杂度)
* 内存整齐度: 复制算法==标记压缩 > 标记清楚算法
* 内存利用率: 标记压缩算法= 标记清楚算法 > 腐殖酸算法
**年轻代**
* 存活率低
* 复制算法
**老年代**
* 区域大:存活率
* 标记清楚+标记压缩混合实现