什么是JVM
class文件
.java -》编译-》.class字节码->JVM运行时数据
线程共享部分 : 共享内存数据,随GC和虚拟机创建和
方法区、堆内存
线程独占部分:
虚拟机栈、本地方法栈、程序计数器
堆内存 程序计数器
执行引擎 - 本地库接口 - 本地方法库
存储 加载类信息、常量、静态变量、编译后的字节码
虚拟机
方法区逻辑分区,实际实现方式不同
堆内存划分根据新年代,老年代(Eden From Survivor To Survivor)划分
垃圾回收器主要是管理堆内存
虚拟机栈
私有空间,由多个Stack Frame组成,一个StackFrame对应一个方法,包括局部变量表,操作数栈,动态链接,方法返回地址,附加信息
本地方法栈
类似虚拟机栈,是为了使用Native本地方法
程序计数器
记录当前执行字节码位置。用途是为了切换线程提供方便恢复
clas内容
javac Demo.java //编译成class
javap -v Demo.class > Demo.txt //转成指令码查看
版本号、访问内容、常量池
descriptor
flags 访问控制
Code:
stack locals args_size
方法中对应操作数栈的深度 本地变量数量 参数数量
指令码若干 偏移量
相关点:操作码和指令码,javap-》提供操作码理解,class里面还是指令码
什么是垃圾收集器
相关: 堆内存 识别对象划分 删除
第一步
标记,划分是否使用
方法:对象回收(引用计数,可达性分析),方法区回收
可达性分析:追踪引用链条,如果对象和GC Roots不可达,不存在引用及可回收对象
GC Roots例如 虚拟机栈正在引用的对象,,本地方法栈正在引用的对象,静态属性引用的对象,方法常量引用的对象
引用类型:
强引用,引用指向一个对象,这个对象不会回收
软引用 内存不足会被回收
弱引用 随时会被回收
虚引用
可达性级别
强可达
软可达
弱可达
幻想可达
不可达
垃圾收集算法
标记清楚
复制
标记整理
分代收集
根据对象存货周期来
不同年代有不同的算法
xin比列大概是 1:1:8
lao 新1:2
Eden Form To Tenured
辣鸡收集器:
MinorGC
新生代:
复制算法
老年代用个标记整理:
标记,清除,整理
串行收集器:
SerialGC Client默认JVM选项,单个线程执行所有垃圾收集工作
SerialOld 老年代,用标记整理算法
并发收集器:
ParallelGC 类似Serial,区别是可以并行,可以设置GC时间 吞吐量,server的默认JVM选项
ParallelOld GC
CMS 专用老年代,标记清除算法,母的是减少停顿时间,比较占用CPU资源
ParNew 老年代 SerilaGC的多线程版本
G1 新老年代可用 针对大堆内存,JDK9后默认选型,替代CMS
JVM调优:
3个组件:堆大小调整,垃圾收集器调整,JIT
目的:响应性,吞吐量
响应性:追求响应速度,---短得暂停时间
吞吐量:追求特定时间段的最大化工作量,---可以高暂停时间
GC调优思路:
分析场景:启动速度?停顿?响应慢?
-》
确实目标:内存占用,低延时,吞吐量
-》
收集日志:通过参数配置收集日志,通过JDK工具查看GC状态
-》
分析日志:通过工具辅助分析日志,查看GC次数和GC时间
-》
调整参数:切换垃圾收集器或者调整参数