- 请你谈谈对jvm的理解?java8虚拟机和之前的变化更新?
- 什么是OOM,什么是栈溢出?怎么分析
- jvm的常用调优参数有哪些?
- 内存快照如何抓取,怎么分析Dump文件
- 谈谈jvm中,类加载器的认识?
1.jvm的位置
操作系统之上,可将其看成一个软件
2.jvm的体系结构
3.类加载器
作用:加载Class文件
三种加载机制:全盘负责,双亲委派,缓存机制
1.虚拟机自带的加载器
2.启动类(根)加载器
3.扩展性加载器
4.应用程序加载器
4.双亲委派机制
一个类加载器收到了类加载请求,它不会自己去加载,而是把这个请求委托给父类的加载器区执行,如果父类加载器还存在父类加载器,它会继续向上委托,直到最顶层。父类加载器能完成类加载任务,就成功返回。如果不能,则子类加载器自己尝试完成。
优势:具备一种优先级的层次关系,避免类的重新加载;安全因素,防止网络传递过来的包,篡改了核心API库中的文件。
5.沙箱安全机制(了解)
沙箱是限制程序运行的环境。沙箱机制就是将java代码限定在虚拟机(JVM)特定的运行范围,并且严格限制代码对本地系统资源访问。
基本组件
字节码校验器:确保Java类文件遵循java语言规范。并不是所有的类文件都会经过字节码校验,比如核心类。
类装载器:防止恶意代码去干涉善意的代码;守护了被信任的类库边界;将代码归入保护域,确定了代码可以进行哪些操作;
6.nativa
nativa:凡是带了nativa关键字的,说明Java的作用范围达不到了,会去调用底层c语言的库。会进入本地方法栈,调用本地方法本地接口(JNI)。
7.pc寄存器(了解)
程序计数器:是线程私有的,就是一个指针,指向方法区中的方法字节码,在执行引擎读取下一条指令,是一个非常小的内存空间。
8.方法区
方法区是被所有线程共享的,构造函数,接口代码也在此定义。所有定义的方法的信息都保存在该区域。
静态变量、常量、类信息(构造方法,接口定义)、运行时的常量池存在方法区中,但是实例变量存在堆内存中,和方法区无关。
栈:先进后出
8大基本类型+对象引用+实例的方法
9.三种jvm
- Sun公司 HotSpot
- BEA公司
- J9VM
10.堆Heap
一个jvm只有一个堆内存,堆内存的大小时可以调节的。
堆内存中分为3个区域
11.新生区
复制算法
- 类:诞生和成长的地方,甚至死亡
- 伊甸园区
- 幸存区(0,1)
12.老年区
标记压缩,标记清除
新生区幸存下来的来到老年区
13.永久区
这个区域常驻内存的。用来存放JDK自身携带的Class对象。
关闭虚拟机就会释放这个区域的内存
- jdk1.6之前:永久代,常量池是在方法区
- jdk1.7:永久代,但是慢慢的退化了,去永久代,常量池在堆中
- jdk1.8之后:无永久代,常量池在元空间
逻辑上存在,物理上不存在
14.堆内存调优
15.GC
内存效率:复制算法>标记清除算法>标记压缩算法
内存整齐度:复制算法=标记压缩算法>标记清除算法
内存利用率:标记压缩算法=标记清除算法>复制算法
16.jmm
17.总结