一、JVM分区
1、方法区
是所有线程共享的内存区域,它用于存储已被Java虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
2、堆
A、是jvm内存中最大的一块,在虚拟机启动时开辟,存放所有数组和对象实例
B、分为新生代和老年代
3、程序计数器
A、保存当前线程正在执行的字节码指令的地址
B、一个线程有一个程序计数器,会记住线程的运行,不然线程挂起后就不知道在 干嘛了,只有run方法
- 虚拟机栈
- 里面有很多栈帧,一个方法一个栈桢,每个栈帧存(局部变量表、操作数栈、 动态链接、出口)
- 局部变量表:8个基本数据类型、对象引用地址、return类型
- 操作数栈:进行运算的
- 动态链接:存放对其他方法的引用链接
- 出口:正常return,不正常抛异常
- 本地方法栈
- 方法上带native关键字,c和c++的
- Java内存结构
- 判断对象是否存活
- 引用计数法:对象在创建时,有计数器,有引用指向就+1,没有引用指向了就 会认为是垃圾,实现简单效率高,但是无法解决循环引用的问题
- 可达性分析算法,现在jvm使用的算法
- 当一个对象到root下没有引用链是为垃圾对象
- GC root:虚拟机栈、静态引用的对象、常量引用的对象、本地方法引用的 对象
- 优点:解决循环引用的问题
2、垃圾回收机制,简称GC
- 程序运行中会有大量内存垃圾,虚拟机会不定时进行GC
- JVM堆分为新生代和老年代,新生代分为Eden、From Survivor、To Survivor区, 这样能更便于虚拟机管理内存。
- 新生代与老年代的内存比值为1:2,(–XX:NewRatio 来指定)
- Eden:From:to = 8:1:1,( 可以通过参数 –XX:SurvivorRatio 来设定 ),所 以新生代中有90% 可以使用的内存。
- 对象会先在Eden区,当新生代内存不够时,经过一次minor GC,存活下来的 对象转入survivor区,每一次gc存活下来,年龄+1,默认15后转入老年代
- 持久代(永久代)就是方法区,存放常量、静态变量和类信息,难以回收
3、垃圾回收算法
A、引用计数法:当引用为0时,回收,优缺点同上被认为垃圾的对象
B、标记-清除算法:标记就是上面说认为是否为垃圾,清除是进行清除,老年代应 用多。
C、标记-整理算法:同上,但是清除后会将可用的内存“整理”到一起,老年代使 用,解决内存碎片化问题,但是移动对象,需要更新引用。
D、复制算法:和C相似,区别在于用两块内存空间,适合survivor区两块
E、JVM参数
参考小杰爱吃蛋的博客
(一篇文章掌握整个JVM,JVM超详细解析!!!_小杰爱吃蛋的博客-CSDN博客_jvm)
全局可在idea包的bin目录下的idea.exe.vmoptions里配置保存
- 调优总结,参考别人