背景
随着互联网的发展以及java生态的不断扩大,目前市面对java方面的人才拥有两方面的要求,一个是扩大自己的知识面对常用的java架构比较熟悉,扩张自己的知识广度,往架构方面发展,另一方面是深挖技术的深度,对java的底层的实现原理进行深挖,往技术专家方向发展。但是不论是往广度还是往深度方向发展,对于java工程师来说,对java虚拟机(jvm)的了解是必不可少的,了解jvm参数会进行性能调优对于我们来说越来越成为一种必备的技能了
jvm参数
堆大小设置
JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478M,另外,整个堆大小=年轻代大小 + 年老代大小 + 持久代大小(JDK8中已经把持久代(PermGen Space) 干掉了,取而代之的元空间(Metaspace)。Metaspace占用的是本地内存,不再占用虚拟机内存)。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-Xmx1800M ## 设置JVM最大可用内存为1800M
-Xms1800M ## 设置JVM初始内存为1800M,建议与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存
-Xmn300M ## 设置年轻代最大大小为300M(-Xmn(-XX:MaxNewSize))
-XX:NewSize=100M ## JVM启动时分配的新生代内存为100M
-Xss512K ## 设置每个线程的堆栈大小512K 。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右,所以根据这个规则可以合理设置自己本机的-Xss
-XX:NewRatio=4 ## 设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代),设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈(除去持久代)的1/5
-XX:SurvivorRatio=4 ## 设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
-XX:PermSize=300M ## 设置持久代初始化大小为300M (JDK8中已经把持久代(PermGen Space) 干掉了)
-XX:MaxPermSize=500M ## 设置持久代最大大小为300M (JDK8中已经把持久代(PermGen Space) 干掉了)
-XX:MaxTenuringThreshold=0 ## 设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。默认值为:15
回收器选择
JVM给了三种选择:串行收