JVM入门_笔记_狂神说
JVM探究
请你谈谈你对jvm的理解?java8虚拟机和之前的变化更新?
什么事oom,什么是栈溢出StackOverFlowError?怎么分析?
jvm的常用调优参数有哪些?
内存快照如何抓取,怎么分析Dump文件?知道吗?
谈谈jvm,类加载器你的认识?
1、jvm的位置
在操作系统之上,包含在jre里。
2、jvm的体系结构
栈、本地方法栈、程序计数器不会发生gc。
jvm调优主要在堆,方法区有一小部分。
3、类加载器
作用:加载.class文件。
新建的对象放入堆里面,引用(地址)放到栈,其中引用指向堆里面对应的对象。
1)虚拟机自带的加载器
2)启动类(根)加载器 Bootstrap ClassLoader
3)扩展类加载器 Extension ClassLoader
4)应用程序(系统类)加载器 Application ClassLoader
4、双亲委派机制
检查顺序从下至上,加载顺序从上到下。
如果一个类加载器需要加载类,那么首先它会把这个类请求委派给父类加载器去完成,每一层都是如此。一直递归到顶层,当父加载器无法完成这个请求时,子类才会尝试去加载。
5、沙箱安全机制
控制远程代码执行的权限。
jdk1.6之后的域。
6、native
包含native关键字的方法,说明java的作用范围拿不到了,会去调用底层c语言的库。
会进入本地方法栈。
调用本地方法接口JNI。
JNI作用:扩展java的使用,融合不同的编程语言为java所用。 最初:c、c++
它在内存区域中专门开辟了一块标记区域:native method stack,登记native方法
在最终执行的时候,通过JNI加载本地方法库中的方法
7、pc寄存器
线程私有,保证线程顺序。
8、方法区
方法区是被所有线程共享的,所有的字段和方法字节码,以及一些特殊方法,如构造函数,接口代码也在此定义,简单说,所有定义方法的信息都保存在该区域,此区域属于共享空间
存储内容:static、final、.class、常量池
9、栈
一旦线程结束,栈就over了。
存储:8大基本类型 + 对象引用 + 实例的方法
10、三种jvm
HotSpot
JRockit BEA
J9 vm IBM
11、堆
Heap,一个JVM只有一个堆内存,堆内存的大小是可以调节的。
堆内存划分:
1)新生区 :Eden、S0、S1。对象在这里诞生、成长、甚至死亡
Eden:所有对象都是在eden区new出来的。
2)老年区
3)永久区:jdk1.8以后,叫元空间(方法区在这里,常量池在方法区里)。这个区域是常驻内存的,用来存放jdk自身携带的class对象。
12、新生区、老年区
13、永久区(元空间)
元空间使用的是直接内存,与新生代和老年代分开。
14、堆内存调优
OOM:1)尝试扩大堆内存看结果
2)分析内存,看一下哪个地方出了问题(专业工具)
Xms1024m Xmx1024m -XX:+PrintGCDetails
在一个项目中,突然出现了OOM故障,那么该如何排除?研究为什么出错
jprofiler作用:
1)分析dump内存文件,快速定位内存泄露
2)获得堆中的数据
3)获得大的对象
15、GC -> 常用算法
轻GC
重GC
引用计数法:记录每个对象 的引用次数,长时间没有被引用的对象就被清除掉。复制算法:
好处:没有内存碎片
坏处:浪费内存空间,多了一半to空间永远是空的。
复制算法最佳使用场景:对象存活度较低的时候 -> 新生区
标记清除算法:
优点:不需要额外的空间。
缺点:两次扫描,严重浪费时间,会产生内存碎片。
标记压缩:
标记 -> 清除 -> 压缩
16、JMM
17、总结