jvm 类型
有两种类型的 hotspot jvm ,即 “server” 和 “client" 。 jvm 可根据内存,机器情况,自动选择jvm类型。 如果想手动选择,则可通过 -server 和 -client 参数指定jvm 类型。
- server : 服务端类型,有更多的堆内存,并行的垃圾收集器,运行时可更大程度的优化代码
- client : 客户端类型,相比服务端类型,有更少的堆内存
- 查看jvm版本以及类型
java -version
jvm 参数分类
- 标准参数
- 稳定的,将来的jvm版本不会改变的参数,可通过 java 或者 java -help 命令检出的
- X参数
- 非标准化的参数,将来的jvm 版本中可能会改变的,可通过 java -X 命令检出,但并不是所有该类型都能检出
- XX 参数
- 不稳定的,甚至是在实验阶段的参数,甚至长时间段内未被列出,该类型参数都以 -XX 开头,但是随后的语法不同,取决于参数的类型。 可通过 -XX:+PrintFlagsFinal 或者 -XX:+PrintFlagsFinalInitial 输出所有XX类型参数信息(参数类型,参数名称,默认值=,被用户或者jvm赋值 :=)
对于布尔类型的参数,我们有”+”或”-“,然后才设置JVM选项的实际名称。例如,-XX:+用于激活选项,而-XX:-用于注销选项。
-XX:+PrintCompilation :输出编译信息
-XX:+ClTime : 关闭jvm 时输出编译时效统计信息
-XX:+PrintCommandLineFlags : 输出所有被用户或者jvm 设置过的XX参数以及值
对于需要非布尔值的参数,如string或者integer,我们先写参数的名称,后面加上”=”,最后赋值。例如, -XX:=给赋值。
jvm 调优参数
- Xms128m : 初始化堆内存大小为128M,不包括永久代的空间,是 -XX:InitailHeapSize=128m 的缩小
- Xmx2g : 最大堆内存大小 为 2G,不包括永久代的空间, 是 -XX:MaxHeapSize=2g 的缩小
- -XX:+HeapDumpOnOutOfMemoryError : jvm 发送内存溢出时自动生成堆内存快照
- -XX:HeapDumpPath=
:设置堆内存快照生成的路径 - -XX:OnOutOfMemory="" : 可接收一串指令,当堆内存溢出时,执行指令
- -XX:PermSize= : 初始化永久代大小
- -XX:MaxPermSize= : 最大永久代大小
新生代垃圾回收
-
新生代特征
- 新生代对象朝生夕死,生命周期短,基本采用复制算法做垃圾回收
-
新生代划分
- 伊甸园区(Eden): 对象最开始在此分配到内存
- 幸存区(suivivor): 新生代垃圾回收时,存活对象符合条件(年龄,大小)会被移入幸存区
- from,to : 大小一致,from 和 to 的作用会来回转换
-
调优参数
- -XX:NewSize : 初始化新生代大小
- -XX:MaxNewSize : 最大新生代大小
- -XX:NewRatio=3 : 老年代和新生代的大小比, 老年代/新生代 : 3/1 ,新生代为整个堆区的 1/4
- -XX:SuivivorRatio=8 : 伊甸园区和单个幸存区(from/to)的大小比 , 伊甸园区占新生代8/10,from和to区域占新生代 1/10
垃圾回收器评估标准
- 吞吐量 :吞吐量越高越好,吞吐量:应用程序线程占程序总用时比例
- 暂停时间 : stop the world 的时间越短越好。
- 高吞吐量和低暂停时间互相矛盾,高吞吐(减少GC 线程占时)-> 减少GC 线程数/ 减少GC次数; 低暂停-> 垃圾回收量有限 -> 增加GC次数 -> 增加GC线程总占有时间 -> 低吞吐
CMS 收集器
-
基本介绍
- 低暂停型收集器,大多数时间GC线程可以和应用线程并行
- 基于标记-清除算法,无压缩操作,容易产生碎片
- 针对老年代
-
执行过程
- 初始化标记:stop the world ,标记gc root 指向的对象为存活对象,标记年轻的中可达老年代的对象
- 并发标记 : gc root tracing ,标记gc root 指向的对象所指向的对象为存活对象
- 并发预清理
- 重标记:stop the world ,修正并发标记阶段应用线程改动了的对象
- 并发清理 : 清理无用引用,回收堆内存
- 并发处置:收尾工作
-
可能存在的问题
- 内存碎片化
- 浮动垃圾 : 并发标记阶段,产生的新垃圾,当前的GC 无法清理的垃圾,需要下次GC 再清理
-
常用命令
- -XX:+UseConcMarkSweepGC :指定使用CMS 收集器
- -XX:+UseCompactAtFullCollection : 开启内存碎片的压缩整合
- -XX:+CMSFullGcsBeforeCompact : 与*-XX:+UseCompactAtFullCollection* 一起使用,指定执行多少次不压缩gc 后,进行一次压缩整合,可缓解碎片化问题
- -XX:CMSInitiatingOccupancyFraction=75 : 老年代使用率达到75%时进行垃圾回收,需要预留空间,给浮动垃圾和新进入老年代的对象,所以该值不能太高
- 1,2,3 步或者2,3,4步的作用