JVM调优

153 阅读3分钟

什么是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时间

-》

调整参数:切换垃圾收集器或者调整参数