JVM
JVM特特特特别基础,有些概念,专有名词是JDK8前后的混用,后面再重新发一篇笔记
- 谈谈对JVM的理解,java8虚拟机和之前的变化更新
- 什么是OOM,什么是栈溢出StackOverFlowError,怎么分析
- JVM的常用调优参数有哪些
- 内存快照如何抓取,怎么分析Dump文件
- JVM中,类加载器的认识
1、JVM的位置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B35YyDIR-1603976197381)(E:\桌面\images\1603524327(1)].png)
2、JVM的体系结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QWhwpzQS-1603976197384)(E:\桌面\images\1603527011(1)].png)
3、类加载器
作用:加载Class文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lvtiJeEg-1603976197386)(E:\桌面\images\1603606193(1)].png)
4、双亲委派机制
APP – > EXC --> BOOT(最终执行)
- 类加载器收到类加载的请求
- 将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器
- 启动加载器检查是否能加载8当前这个类,能加载就结束,使用当前的加载器,否则,通知子加载器进行加载
- 重复步骤3
5、native
native
private native void start0();
-
凡事带了native关键字的,说明java的作用范围达不到了,回去调用底层c语言的库
-
会进入本地方法栈
-
调用本地方法接口 JNI
-
JNI作用:扩展java的使用,融合不同的编程语言为java所用
-
在内存区域中专门开辟; 一块标记区域:Native Method Stack ,登记Native方法
-
在最终执行的时候,加载本地方法库中的方法
6、方法区
Method Area
方法区(永久代)是被所有线程共享,所有字段和方法字节码,以及一些特殊方法,如构造函数,接口代码也在此定义,简单来说,所有定义的方法的信息都保存在该区域,此区域属于共享区域
静态变量,常量,类信息(构造方法,接口定义)、运行时的常量池存在方法区中,但是实例变量存在堆内存中,与方法区无关
static ,final , Class模板 ,常量池( java6及之前,7开始放在堆)
7、栈
先进后出,后进先出
8大基本类型+对象引用+实例的方法
运行原理:栈帧
8、堆
-
Heap,一个JVM只有一个堆内存,堆内存的大小是可以调节的
-
类加载器读取了类文件后,一般会把什么东西放到堆中?类,常量,方法,变量,常量池,保存我们所有引用类型的真实对象
-
堆内存中还要细分为三个区域
- 新生代 Young/New
- 老年代 Tenured
- 永久代 perm(1.7前,18开始为元空间–不在虚拟机中,使用本地内存 )
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nSQuL7zj-1603976197390)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201025231709604.png)]
新生代
-
类:诞生和成长的地方,甚至死亡
-
伊甸园 所有对象都是伊甸园区new 出来的
-
幸存者区(0,1)
永久代
这个区域常驻内存的。用来存放JDK自身携带的Class对象,Interface元数据,存储的是java运行时的一些环境或类信息,这个区域不存在垃圾回收。关闭vm虚拟就会释放这个区域的内存
一个启动类,加载了大量第三方jar包。tomcat部署了太多应用,大量动态生成的反射类。不断的被加载,直到内存满,就会出现OOM
- jdk1.6之前:永久代,常量池是在方法区
- jdk1.7 :永久代,但是慢慢退化,
去永久代
,常量池在堆中 - jdk1.8之后 :无永久代,常量池在元空间
9、分析OOM
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WtjcLplU-1603976197393)(E:\桌面\images\1603697385(1)].png)
10、GC
算法
标记清除法,标记压缩,复制算法,(引用计数器)
复制算法
-
幸存区to、from 会交换,谁空谁是to
-
每次GC都会讲Eden火的对象移到幸存区:一旦Eden区被GC后,就会是空的
-
当一个对象经历了15次GC,都还没有死,就会进入老年代
-
通过这个参数设定进入老年代的时间
- -XX:MaxTenuringThreshold= n n-几次
好处:没有内存的碎片
坏处:浪费了内存空间,多了一半空间永远是空to。
复制算法最佳使用场景:对象存货度较低的时候
标记清除算法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8UWbXZ3m-1603976197394)(E:\桌面\images\1603701172(1)].png)
- 优点:不需要额外的空间
- 缺点:两次扫描,严重浪费时间,会产生内存碎片
标记压缩
再优化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-56WEXUpE-1603976197395)(E:\桌面\images\1603701447(1)].jpg)
标志清除压缩
先标志清除几次,再进行压缩
11、总结
内存效率:复制算法>标志清除算法>标志压缩算法(时间复杂度)
内存整齐度:制算法=标志压缩算法>标记清除算法
内存利用率:标志清除算法=标志压缩算法>复制算法
新生代:
- 存活率低
- 复制算法
老年代:
- 区域大,存活率
- 标志清除(内存碎片不是太多)+标记压缩混合实现