JVM实践(一)参数调优

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/x18094/article/details/89415887

JVM实践(一)参数调优

    对于实践党来说,学习理论真的很枯燥无味,完成了JVM相关的知识储备《JVM入门(一)栈和堆》系列,就要开始实践了,不能停留于理论知识。学习完堆、栈,以及年轻代,老年代,垃圾收集器等知识。但是学完以后,参数在哪里调?参数调整有什么效果?这些都不得而知,或者零零散散看过一些参数,但没有集中到一处,空有一身理论,却无法施展,就像你背了一堆的菜谱,却不动手做菜,总觉得差点什么。

1.JVM参数在哪里配置?

(1)windows下添加JVM参数 
到Tomcat的bin目录下的catalina.bat,添加如下参数:

set "JAVA_OPTS=-Xms512M -Xmx1024M"

(2)linux下添加JVM参数
Tomcat的bin目录下的catalina.sh,添加如下参数:
JAVA_OPTS="-Xms512M -Xmx1024M"

(3)eclipse下添加JVM启动参数

run configuration-arguments-vm arguments 添加:-Xms512M -Xmx1024M

2.堆调优

一、知识储备

(1)查看堆大小命令:jvisualvm 或者jconsole 
(2)堆内存与非堆内存
java内存分为堆内存与非堆内存。堆内存给程序使用,非堆内存留给JVM自己使用。非堆内存存放类型(类和接口)的信息,与堆的区别是在运行期GC不会释放空间,因此,如果有过多的第三方Jar包或者过多的class文件,可能造成溢出。值得注意的是tomcat热部署不会清理之前的加载内容,因此热部署几次容易造成java.lang.OutOfMemoryError: PermGen space。

非堆内存=放本地代码代码缓冲区CC(code cache)+保存JVM自己的静态数据永久代(Perm Gen)+JVM stack+Lacal Method Stack

Java8以后删除了永久代(PermGen),取而代之的是Metaspace。

二、参数配置

1.堆大小调整    
堆内存:

-Xms 128m 初始堆内存,默认物理内存1/64,当空余堆内存小于40%时,会增加到-Xms的最大限制。
-Xmx 128m 最大堆内存 默认物理内存1/4,当空余堆内存大于70%时,会减小到-Xms的最小限制。
    设置技巧:Xms可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
非堆内存:

-XX:PermSize 非堆内存的初始值,默认物理内存1/64。
-XX:MaxPermSize 非堆内存最大值,默认物理内存1/4。

非堆内存溢出:java.lang.OutOfMemoryError: PermGen space
解决方法:调大 -XX:PermSize
2.年轻代大小调整

-Xmn 1g 增加年轻代大小,会缩小老年代大小,减少FULL GC次数。

3.每个线程堆栈大小配置
-Xss 128k  相同条件下,随着数值的减少,可以增加线程数,生成更多线程。
不过操作系统对进程内的线程数有限制,一般最大在3k~5k左右。 

JDK5.0以后每个线程堆栈大小默认为1M
4.年轻代与老年代比值
-XX:NewRatio=4  老年代(不含持久代)/年轻代 ,即老年代:年轻代=4:1 老年代占4/5。

5.Eden区与Survivor区大小比值
-XX:SurvivorRatio=4  这个配置表示:伊甸区/1个存活区=4/1。
由于年轻代=1个伊甸区+2个存活区,因此伊甸区/存活区(2个)=4/2,所以1个存活区占1/6。

6.持久代(永久代)大小
-XX:MaxPermSize=16m

Java 8元空间:与永久代类似,区别在于元空间使用的是本地的内存,而永久代使用JVM内存。

-XX:MetaspaceSize               初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。

-XX:MaxMetaspaceSize           最大空间,默认是没有限制的。 

7.年轻代垃圾最大年龄
-XX:MaxTenuringThreshold=15 默认是15岁。
 值得注意的是:-XX:MaxTenuringThreshold=0 如果设置为0,则放弃年轻代复制回收机制,不进入Survivor区,直接转移到老年代。
 对于大对象较多的应用,即老年代较多时,增加年轻代岁数,可以让对象更长时间留在年轻代进行复制回收,减少老年代FULL GC时间,可以提高效率。

猜你喜欢

转载自blog.csdn.net/x18094/article/details/89415887