怎么对JVM的性能进行优化

怎么对JVM的性能进行优化?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1、JVM内存模型

怎么对JVM的性能进行优化

总结:可以发现最明显的一个变化是元空间从虚拟机转移到了本地内存。默认情况下,元数据空间大小仅受限于本地内存, 这意味着以后不会因为永久代大小不够而抛出OOM异常了。 jdk1.8以前,HotSpot VM将class和类的jar包数据存储在PermGen里, PermGen大小是固定的,而且项目之间无法公用公有的class,所以很容易碰到OOM异常。改成MateSpace后, 各个项目会共享同样的class空间。比如多个项目都引用了apache-common包, 在MateSpace中只会存储一份的apache-common的class,提高了内存的利用率,垃圾回收更有效。

2、JVM堆内存常用参数

参数描述-Xms堆内存初始大小,单位m、g-Xmx(MaxHeapSize)堆内存最大允许大小,一般不要大于物理内存的80%-XX:PermSize非堆内存初始大小,一般应用设置初始化200m,最大1024m就够了-XX:MaxPermSize非堆内存最大允许大小-XX:NewSize(-Xns)年轻代内存初始大小-XX:MaxNewSize(-Xmn)年轻代内存最大允许大小,也可以缩写-XX:SurvivorRatio=8年轻代中Eden区与Survivor区的容量比例值,默认为8,即8:1-Xss堆栈内存大小

3、GC(Garbage Collection)算法

这里的GC具体指的是新生代的复制算法

首先贴一张网上盗来的大图,用它来说明一下GC的过程

怎么对JVM的性能进行优化

内存分配策略:

大多数情况下,对象在新生代的Eden中分配。当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC,而大对象(需要大量连续内存空间的Java对象,类似长字符串和数组)将通过分配担保机制直接进入老年代。

Minor GC——复制算法具体过程:

将Eden和S0中还存活着的对象一次性的复制到S1中,并且清理掉Eden与S0的空间。如果S1放不下还存活着的对象,那这些对象将通过分配担保机制进入老年代。【原理上随时保持S0和S1有一个是空的,用来存下一次的对象】

Eden区快满的时候,会进行上一步类似操作,将Eden和S1区的年纪大的对象放到S0区【此时S1区就是空的】
直到Eden区快满,S0或者S1也快满的时候,这时候就把这两个区的年纪大的对象放到Old区。

依次循环,直到Old区也快满的时候,Eden区也快满的时候,会对整个这一块内存区域进行一次大清洗(FullGC),腾出内存,为之后的对象创建,程序运行腾地方。

新生代GC(Minor GC):指发生在新生代的垃圾回收动作,因为java对象大多具备朝生夕灭的特征,所以Minor GC发生的特别频繁,

一般回收速度也很快。

老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC,至少会伴随一次的MinorGC(但非绝对,
在Parallel Scavenge收集器的收集策略里就有直接进行Minor GC的策略选择过程)。Major GC的速度一般比Minor GC慢10倍以上。

4、JVM参数配置

在jdk1.8以前,生产环境一般有如下配置

-XX:PermSize=512M -XX:MaxPermSize=1024M

表示在JVM里存储Java类信息,常量池和静态变量的永久代区域初始大小为512M,最大为1024M。在项目启动后,这个值是固定的,如果项目class过多,很可能遇到OutOfMemoryError: PermGen异常。

升级JDK1.8之后,上面的perm配置已经变成

-XX:MetaspaceSize=512M XX:MaxMetaspaceSize=1024M

MetaspaceSize如果不做配置,通过jinfo查看默认MetaspaceSize大小(约21M),MaxMetaspaceSize很大很大,前面说过MetaSpace只受本地内存大小限制。

jinfo -flag MetaspaceSize 1234 #结果为:-XX:MetaspaceSize=21807104
jinfo -flag MaxMetaspaceSize 1234 #结果为:-XX:MaxMetaspaceSize=18446744073709547520

干货:MetaspaceSize为触发FullGC的阈值,默认约为21M,如做了配置,最小阈值为自定义配置大小。空间使用达到阈值,触发FullGC,同时对该值扩大。当然如果元空间实际使用小于阈值,在GC的时候也会对该值缩小。
MaxMetaspaceSize为元空间的最大值,如果设置太小,可能会导致频繁FullGC,甚至OOM。

5. JVM参数配置指南

前面三个部分对JVM进行了整体的了解,接下来是本文的重点。

怎么对JVM的性能进行优化