JVM调优

JVM调优工具推荐:

windows:
    jdk自带的jvisualvm.exe性能分析工具
linux:
    TProfiler(收费)
    Arthas(阿里开源)https://alibaba.github.io/arthas/
1、可视化窗口查看JVM运行情况:
jdk安装目录bin文件夹下:jvisualvm.exe 
2、jvm各个参数说明:
-XX:MetaspaceSize=128m (元空间默认大小jdk1.8) 
-XX:MaxMetaspaceSize=128m (元空间最大大小jdk1.8) 
-Xms1024m (堆默认大小) cpu性能高时此值应设的大一些
-Xmx1024m (堆最大大小) Java heap最大值,使用的最大内存
上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。
-Xmn256m (新生代大小) 一般设置为Xmx的3、4分之一
-Xss256k (棧最大深度大小) 
-XX:SurvivorRatio=8 (新生代分区比例 8:2) 
-XX:+UseConcMarkSweepGC (指定使用的垃圾收集器,这里使用CMS收集器) 并行并发CMS垃圾回收器 对cpu消耗大。
-XX:+UseParNewGC :缩短minor收集的时间
-XX:+PrintGCDetails (打印详细的GC日志)
-XX:NewRatio=4 	表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5 Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置。
-XX:SurvivorRatio 设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
3、jdk8对jvm调整:
JDK8之后把-XX:PermSize 和 -XX:MaxPermGen移除了,取而代之的是 
-XX:MetaspaceSize=128m (元空间默认大小)
-XX:MaxMetaspaceSize=128m (元空间最大大小) 
JDK 8开始把类的元数据放到本地化的堆内存(native heap)中,这一块区域就叫Metaspace,中文名叫元空间。 
使用本地化的内存有什么好处呢?最直接的表现就是java.lang.OutOfMemoryError: PermGen 空间问题将不复存在,因为默认的类的元数据分配只受本地内存大小的限制,也就是说本地内存剩余多少,理论上Metaspace就可以有多大(貌似容量还与操作系统的虚拟内存有关?这里不太清楚),这解决了空间不足的问题。不过,让Metaspace变得无限大显然是不现实的,因此我们也要限制Metaspace的大小:使用-XX:MaxMetaspaceSize参数来指定Metaspace区域的大小。JVM默认在运行时根据需要动态地设置MaxMetaspaceSize的大小。
4、堆内存分配
 JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;
 JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。
 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;
 空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。
 因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小。
 说明:如果-Xmx 不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM,不是Throwable的,无法用try...catch捕捉	。
5、非堆内存分配
 JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;
 由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4
(还有一说:MaxPermSize缺省值和-server -client选项相关,-server选项下默认MaxPermSize为64m,-client选项下默认MaxPermSize为32m。这个我没有实验。)
6、JVM内存限制(最大值)
JVM内存限制于实际的最大物理内存
对于32位操作系统来说:Windows系统下为1.5G-2G,Linux系统下为2G-3G
对于64位操作系统来说:不会有限制
7、spring配置懒加载
spring.main.lazy-initialization=true
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页