JVM
2023-02-26 08:15:44 0 举报
AI智能生成
登录查看完整内容
超级易懂的脑图,看一遍基本能记住,多看几遍面试无忧
作者其他创作
大纲/内容
启动类加载器 Botstrap-classLoader
扩展类加载器 Extensions ClassLoader
系统类加载器 Application classLoader
用户自定义类加载器
根据类全限定名来装载class文件到运行时数据区域
类加载器
导入文件
加载
格式验证
验证
静态变量分配内存空间
准备
虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址;
解析
初始化静态变量、静态代码
初始化
类加载过程
执行class文件中的指令
执行引擎
两个子系统
存储类的基本信息
常量
静态变量
即时编译后的代码
方法区(method area)
endn
survivor 0
survivor2
新生代
老年代
永久代
1.8之后元空间替代永久代
存储几乎所有的对象实列
复制算法
标记-清除算法/标记-整理
Full-GC
堆heap内存
局部变量表
操作数栈
动态链接
方法出口
虚拟机栈(vm-stack)
字节码指令执行行号指示器
程序计数器(count register)
虚拟机调用 Native 方法服务
本地方法栈
运行时数据区域(VM 内存)
提供与本地机器交互的接口
本地接口
两个组件
程序员不需要显式地去释放对象内存,虚拟机自行执行
在JVM中,垃圾回收有一个线程,首先它是低优先级的,正常情况下是不执行的,只有当虚拟机空闲时或者内存溢出的情况才会触发
扫描所有没有引用的对象,并添加到回收集合中,进行回收
垃圾回收机制
错误的内存回收会导致程序或者系统不稳定甚至崩溃
Java提供GC功能自动监测对象是否超出作用域,从而达到自动回收内存的目的
为什么要GC
缺点:循环引用
引用计数法-对象引用+1
可达性分析法 GC-root
如何界定对象是否可以回收
效率不高,无法清除垃圾碎片
标记-清除
标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存;缺点:存在对象移动,一定程度上影响了效率
标记-整理
缺点:内存使用率不高,只用原来的一半
复制
对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法
分代算法
垃圾回收算法
新生代单线程收集器,优点:简单高效
Serial收集器
新生代-复制算法
新生代多线程并行收集器
ParNew收集器
新生代并行收集器,特点:高吞吐量,追求高效利用CPU
Parallel Scavenge收集器
老年代单线程收集器
Serial old收集器
老年代-标记整理
老年代并行收集器,特点:高吞吐,高效利用CPU
Parallel Old收集器
老年代-标记整理算法
追求最短回收时间
特点:高并发、短停顿
老年代并行收集器
CMS
老年代-标记清除算法
作用于整个Java堆,高效利用内存空间,不会产生内存碎片
Java堆并行收集器
G1
Java堆-标记整理算法
垃圾收集器(7种)
新生代对象年龄超过15岁进入老年代,即MinorGC15次,对象晋升到老年代
长期存活对象将进入老年代
垃圾收集器
内存、线程、类进行监控
jconsole
可以分析:内存快照、线程快照、程序死锁、监控内存的变化、gc 变化等
jvisualvm
工具
-Xms2g:初始化推大小为 2g;-Xmx2g:堆最大内存为 2g;-XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4;-XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:2;–XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合;-XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器组合;-XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;-XX:+PrintGC:开启打印 gc 信息;-XX:+PrintGCDetails:打印 gc 详细信息。
调优参数
JVM调优
JVM
0 条评论
回复 删除
下一页