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