您当前的位置: 首页 >  jvm

星夜孤帆

暂无认证

  • 2浏览

    0关注

    626博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JVM调优

星夜孤帆 发布时间:2020-12-11 10:02:51 ,浏览量:2

一、JVM调优和参数配置 1.1 JVM参数类型 1.1.1 标配参数
java -version

java -help

java -showversion

在jdk各个版本之间稳定,很少有大的变化

1.1.2 X参数
-Xint:解释执行

-Xcomp:第一次使用就编译成本地代码

-Xmixed:混合模式

 

1.1.3 XX参数

如何查看一个正在运行中的java程序,它的某个jvm参数是否开启?具体值是多少?

jps -l #查看进程号

jinfo -flag PrintGCDetails 进程号 #查看该进程号是否开启某个参数

1.Boolean类型

公式:

-XX:+或者- 某个属性值

+表示开启, -表示关闭

1.是否打印GC收集细节

-XX:+PrintGCDetails

-XX:-PrintGCDetails

2.是否使用串行垃圾收集器

-XX:+UseSerialGC

-XX:-UseSerialGC

2.KV设置类型

1.公式

-XX:属性key=属性值value

2.Case

-XX:MetaspaceSize=128m

-XX:MaxTenuringThreshold=15

3.jinfo举例,如何查看当前运行程序的配置

jinfo -flag 配置项 进程编号

Command line表示我们后台修改过的值

4. 经典参数

-Xms和-Xmx

-Xms: 等价于-XX:InitialHeapSize初始化堆内存

-Xmx: 等价于-XX:MaxHeapSize最大堆内存

这两个参数也还是属于XX参数,只不过这两个参数常用,所以,就起了一种别名来代替复杂的名字

1.2 查看JVM默认值 1.2.1 -XX:+PrintFlagsInitial
-XX:+PrintFlagsInitial:查看初始默认值

java -XX:+PrintFlagsInitial -version

java -XX:+PrintFlagsInitial

1.2.2 -XX:+PrintFlagsFinal
-XX:PrintFlagsFinal:主要查看修改更新

java -XX:+PrintFlagsFinal

java -XX:+PrintFlagsFinal -version

1.2.3 PrintFlagsFinal举例,运行Java命令的同时打印出参数

初始值

java -XX:+PrintFlagsFinal -version

更新值

java -XX:+PrintFlagsFinal -Xss128k Test

1.2.4 -XX:+PrintCommandLineFlags
java -XX:+PrintCommandLineFlags -version

二、JVM常用基本配置参数 2.1 元空间

long totalMemory = Runtime.getRuntime().totalMemory();  //返回java虚拟机中的内存变量
long maxMemory = Runtime.getRuntime().maxMemory(); //返回java虚拟机试图使用的最大内存量
System.out.println("TOTAL_MEMORY(-Xms) = " + totalMemory + " (字节) 、" +(totalMemory / (double)1024 / 1024 + "MB"));
System.out.println("MAX_MEMORY(-Xmx) = " + maxMemory + " (字节) 、" +(totalMemory / (double)1024 / 1024 + "MB"));
2.2 常用参数 2.2.1 -Xms
堆初始大小内存,默认为物理内存1/64
-Xms等价于-XX:InitialHeapSize
2.2.2 -Xmx
堆最大分配内存,默认为物理内存1/4
-Xmx等价于-XX:MaxHeapSize
2.2.3 -Xss
设置单个线程的栈空间大小,一般默认为512K-1024K
-Xss等价于-XX:ThreadStackSize

系统出厂默认值是跟平台有关,一般生产环境都是部署到linux系统(也即1024KB)

2.2.4 -Xmn
-Xmn 
设置年轻代大小,一般都不用设置,一般都是用默认的即可
年轻代占堆的1/3,年老代占堆的2/3
2.2.5 -XX:MetaspaceSize
设置元空间大小
-XX:MetaspaceSize

元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:

元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。不管是几个G的内存,元空间默认都只占用20多M

java -XX:+PrintFlagsFinal -version

21807104/1024/1024=20.8M

虽然,机器内存有16G,但是实际元空间默认只占了约21M,如果频繁反复的去new一些对象,就可能把这个给撑爆,为了避免元空间OOM,可以将元空间配置的大一些

2.2.6 典型设置案例

打印结果

-XX:InitialHeapSize=266207424 
-XX:MaxHeapSize=4259318784 
-XX:+PrintCommandLineFlags 
-XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops 
-XX:-UseLargePagesIndividualAllocation 
-XX:+UseParallelGC 并行垃圾收集器

更改参数

-Xms128m -Xmx4096m -Xss1024k -XX:MetaspaceSize=512m -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseSerialGC
-XX:InitialHeapSize=134217728 
-XX:MaxHeapSize=4294967296 
-XX:MetaspaceSize=536870912 
-XX:+PrintCommandLineFlags 
-XX:+PrintGCDetails 
-XX:ThreadStackSize=1024 
-XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops 
-XX:-UseLargePagesIndividualAllocation 
-XX:+UseSerialGC   串行垃圾收集器
 2.2.7 -XX:+PrintGCDetails
-XX:+PrintGCDetails 输出详细GC收集日志信息

 

 GC

FullGC

2.2.8 -XX:SurvivorRatio

设置新生代中eden和S0/S1空间的比例
默认
-XX:SurvivorRatio=8, Eden:S0:S1=8:1:1
假如
-XX:SurvivorRatio=4, Eden:S0:S1=4:1:1
SurvivorRatio值就是设置eden区的比例占多少,S0/S1相同

 

2.2.9 -XX:NewRatio
配置新生代与老年代在堆结构的占比

默认

-XX:NewRatio=2 新生代占1,老年代占2,年轻代占整个堆的1/3

假如

-XX:NewRatio=4 新生代占1,老年代占4,年轻代占整个堆的1/5

NewRatio值就是设置老年代的占比,剩下的1给新生代

2.2.10 -XX:MaxTenuring Threshold

-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代的存活时间,增加在年轻代被回收的概率。

-XX:MaxTenuringThreshold 设置垃圾最大年龄

 

视频教程,源码

关注
打赏
1636984416
查看更多评论
立即登录/注册

微信扫码登录

0.1643s