(转)JVM参数的说明、简单记法和GC调优策略

背景:在进行jvm调优的时候参数总是记不住,也不知道为啥要调优

https://blog.csdn.net/u013066244/article/details/88089766

环境

java7+

前言

看了大部分博文对JVM所谓调优就是修改参数值,但是我觉得这不算调优,比如:将最大内存值调大了,这就叫调优吗?
每次别人问我服务器怎么调优,我都会理解成,怎么修改源码或者用某种算法去提升性能,而不是改什么参数;

好了,上面就是吐槽了,JVM调优应该是个很高大上的东西,但是看别人博客就是调参数,不能苟同;

说起参数,JVM的参数,对我这记性不好的人来说,还是蛮难记的;

看到知乎的上的评论,过来做个笔记

参数

JVM参数说明
- Xmx 设置堆的最大内存值,等同于-XX:MaxHeapSize
-Xms 设置JVM启动时,堆的初始化大小
-Xmn 设置堆中新生代初始化及最大大小
-Xss 设置线程大小,等同于-XX:ThreadStackSize
-XX:PermGen 设置永久代内存的初始化大小(Java8中开始废弃永久代)
-XX:MaxPermGen 设置永久代的最大值
-XX:SurvivorRatio 设置Eden区和Survivor区的空间比例:Eden/S0 = Eden/S1 默认为8
-XX:NewRatio 设置年老代和年轻代的比例大小,默认值为2

-Xms 如果要进一步细化:初始化大小用-XX:NewSize,最大大小用-XX:MaxNewSize

简单记法

参数记法
-Xmx Memory Maxumaximum 理解为max的缩写mx
-Xms Memory Start-up
-Xmn Memory new
-Xss Stack size

GC调优原则

1、多数的Java应用不需要在服务器上进行GC优化;
2、多数导致GC问题的情况,都不是因为设置参数错误造成的,而是代码问题;
3、在应用上线之前,先考虑将机器的JVM参数设置到最合适(最优);
4、减少使用全局变量和大对象;如果迫不得已创建了很多大对象,在不使用时,应该手动赋予null(在公司有过实际经历);
5、GC优化是最后不得已才采用的手段

GC的目的

1、将转移到老年代的对象数量降低到最小
2、减少GC的执行时间

策略1

将新对象预留在新生代,由于Full GC的成本远高于Minor GC ,因此尽量将对象分配在新生代是明智的做法,实际项目中根据GC日志分析新生代空间是否分配合理,适当通过-Xmn 命令来调节新生代大小,最大限度降低新对象进入老年代的情况。

策略2

大对象进入老年代,虽然大部分情况下,将对象分配在新生代是合理。但是对于大对象这种做法却是不太好的,大对象如果首次在新生代分配可能会出现空间不足导致很多年龄不够的小对象被分配到老年代,破坏了新生代的结构,可能出现频繁的Full GC。因此,对于大对象,可以设置直接进入老年代;
-XX:PretenureSizeThreshold 可以设置直接进入老年代的对象大小。

策略3

合理设置进入老年代对象的年龄,-XX:MaxTenuringThreshold设置对象进入老年代的年龄大小,减少老年代的内存占用,降低发生Full GC的频率。

策略4

设置合理的堆大小,堆大小设置有两个参数:-Xms 初始化堆大小Xmx最大堆大小。

不需要GC优化的情况

1、MinorGC 执行时间不到50ms
2、MinorGC 执行不频繁,约10秒一次
3、Full GC 执行时间不到1s
4、Full GC 执行频率不算频繁,不低于(大约)10分钟一次

参考地址:JVM 配置常用参数和常用 GC 调优策略
JVM的GC 参数为什么要这么命名:xms、xss、xmn和xmn?

posted @ 2020-08-05 21:14  CS408  阅读(308)  评论(0编辑  收藏  举报