JVM
1、常见面试问题
## 1、谈谈堆JVM的理解
## 2、java8中JVM的新内容
## 3、什么是OOM、什么是StackOverFlowError?怎么分析
## 4、JVM的调优常见参数
## 5、内存快照如何抓取
## 6、如何分析Dump文件
2、JVM的位置
3、JVM的体系结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-55yUPkq2-1611572145752)(C:\Users\29683\AppData\Roaming\Typora\typora-user-images\image-20210125170651085.png)]
4、类加载器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F9qXtWa1-1611572145756)(C:\Users\29683\AppData\Roaming\Typora\typora-user-images\image-20210123162017958.png)]
(1)类加载器种类
启动类加载器(Bootstrap classLoader),
||(向下)
拓展类加载器(Extension classLoader);
||
应用类加载器(ApplicationClassLoader)
5、双亲委派机制(安全)
---如果要实例化一个对象,则会一开始向上逐层查找ClassLoader一直 到顶层的Bootstrap,如果启动类加载器里面有对应的.class比如 java.lang.String,则会使用启动类加载器,执行已有的class。
---如果自己定义一个类如Student是启动类加载器中所没有的则会向下 查找,最终会通过应用类加载器进行实例化。(见上图)
---过程
1、加载器接收到类加载的请求
2、将这个请求向上委托给父类加载器进行完成一直向上委托,直到启动类加载器
3、启动类加载器检查是否能够加载当前这个类,能加载就直接运行,使用当前的加载器,否则抛出异常通知自家在其
(会出现经典错误 ClassNotFoundException
6、沙箱安全机制
===Java的安全机制,限制Java代码使用系统资源,CPU、内存等
7、Native
(1)、凡是带了native关键字的
说明java语言的作用范围达不到了,需要区底层调用C语言的库。(本地方法接口JNI),会进入本地方法栈,会调用本地方法接口,JNI(java Native Interface)
(2)、JNI的作用
扩展Java的使用,融合人不同的编程语言为Java所用,Java诞生的时候C和C++横行,要想立足就必须调用c,C++的接口,Java在内存中专门开辟了一块标记区域:Native Method Stack,登记native方法,在最终执行的时候加载本地方法库中的方法通过JNI。
8、PC寄存器
9、方法区
静态变量、常量、类信息(构造方法和接口定义)、运行时的常量池存在方法区中,但是实例变量存在堆内存中,和方法区无关(static、final、CLass,常量池)
10、栈
11、三种JVM虚拟机
12、堆
(1)一个JVM只有一个堆内存,可以调节大小。
(2)、OOM,对内存满,OutOfMemoryError:java heap space
(3)、OOM的解决方法:
---尝试扩大堆内存
---分析内存,看一下那个地方出现问题(Java内存分析工具JProfier插件以及软件客户端)
=== 分析Dump内存文件,快速定位内存泄漏问题
=== 获得堆中的数据,获得大的对象
13、新生区
=== 类:诞生、成长甚至死亡的地方(90%的对象都活不过Eden区)
=== Eden区:
=== Survivor0(from区):
=== Survivior1(to区):
(form区和to区不确定,谁空谁是to区)
=== 通过 -XX:MaxTenuringThreshold=15参数设定可以进入老年代时间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NPPANyae-1611572145758)(C:\Users\29683\AppData\Roaming\Typora\typora-user-images\image-20210125181839094.png)]14、老年区
15、堆内存调优
16、GC
GC常用算法
常用题目:
1、JVM内存模型以及内存分区,详细到每个区放什么
2、堆里面的分区有哪些?Eden,from,to,老年,说说他们的特点
3、轻GC和Full GC什么时候发生以及作用范围
--- 回收算法:标记清除法、标记整理、引用计数
--- 判断是否回收:
4、复制算法(谁空谁是to区)
好处:没有内部碎片
坏处:浪费了内存空间,to区永远是空的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y9snrY5Z-1611572145762)(C:\Users\29683\AppData\Roaming\Typora\typora-user-images\image-20210125182212422.png)]
5、标记清除算法
好处:不需要额外的空间
坏处:两次扫描,严重浪费时间,会产生内部碎片
6、标记压缩:在标记清除算法的基础上消除了内部碎片。
各种算法比较
内存效率:复制算法>标记清除>标记压缩
内存整齐度:复制算法=标记压缩>标记清除
内存利用率:标记压缩=标记清除>复制算法
GC分代收集算法
年轻代:复制算法(存活率低)
老年代:标记清除+标记压缩混合实现(存活率高)
17、JMM(Java Memory Model)
1、什么是JMM
2、有什么用
--作用:缓存一致性协议、用于定义数据读写的规则。
--举例:多个线程如何使用内存就产生了一定的关系,JMM定义了线程和JVM主内存之间的关系:线程之间的共享变量存储 在主内存中,每个线程都有自己的私有的本地内存,如下图,如果同时写入内存如何保持一致性,和 Synchronized和volatile产生联系
--主要解决共享对象可见性的问题:volatile
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZgxrlEIS-1611572145764)(C:\Users\29683\AppData\Roaming\Typora\typora-user-images\image-20210125184630089.png)]
3、该如何学习
---JMM是抽象的概念,主要学习volatile的用法
---JMM定义的规则(协议):
https://www.cnblogs.com/null-qige/p/9481900.html